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), 20 September 2023 Columns, left to right: (1) Filename, (2) line number and (3) hex address of limiting branch instruction (4) Direction of limiting branch: ^=backwards, v=forwards, Space=N/A (5) Hex number of bytes that may be inserted at this address, or between the branch instruction and the target SYMBOL at this address (NB: a more generous limit than shown may apply on the far side of the symbol.) --=no limit. (6) Current source filename, (7) line of assembly listing which typically starts with source line number, hex address and optional hex equate. *emulateturbo Acorn 6502 Tube 6502 Emulator OS 0.64 (19 Oct 1988) HIBASIC >*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 FA CA 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 3C = SOH -- MOS01 0137 C335 95 = STX -- MOS01 0138 C336 A0 = ETX -- MOS01 0139 C337 AC = EOT -- MOS01 0140 C338 B8 = ENQ -- MOS01 0141 C339 12 = ACK -- MOS01 0142 C33A 77 = BELL -- MOS01 0143 C33B C4 = BS -- MOS01 0144 C33C 63 = HT -- MOS01 0145 C33D EF = LF -- MOS01 0146 C33E 5A = VT -- MOS01 0147 C33F 47 = FF -- MOS01 0148 C340 B9 = CR -- MOS01 0149 C341 8C = SO -- MOS01 0150 C342 A5 = SI -- MOS01 0151 C343 C7 = DLE -- MOS01 0152 C344 00 = DCA -- MOS01 0153 C345 04 = DCB -- MOS01 0154 C346 82 = DCC -- MOS01 0155 C347 3F = DCD -- MOS01 0156 C348 9A = NAK -- MOS01 0157 C349 D0 = SYN -- MOS01 0158 C34A D6 = ETB -- MOS01 0159 C34B 0D = CAN -- MOS01 0160 C34C 62 = EM -- MOS01 0161 C34D 93 = SUB -- MOS01 0162 C34E 12 = ACK ;Points to an RTS -- MOS01 0163 C34F F9 = FS -- MOS01 0164 C350 76 = GS -- MOS01 0165 C351 64 = RS -- MOS01 0166 C352 91 = US -- MOS01 0167 C353 D8 = 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 5F = SYN:SHR:&8-CODORG:SHL:&4+&10-&1 ;Queue 1 byte (SYN) -- MOS01 0197 C36B 57 = ETB:SHR:&8-CODORG:SHL:&4+&10-&9 ;Queue 9 bytes (ETB) -- MOS01 0198 C36C 78 = CAN:SHR:&8-CODORG:SHL:&4+&10-&8 ;Queue 8 bytes (CAN) -- MOS01 0199 C36D 6B = EM:SHR:&8-CODORG:SHL:&4+&10-&5 ;Queue 5 bytes (EM) -- MOS01 0200 C36E C9 = /(SUB ) -- MOS01 0201 C36F C5 = /(ACK ) ;Points to an RTS -- MOS01 0202 C370 3C = FS:SHR:&8-CODORG:SHL:&4+&10-&4 ;Queue 4 bytes (FS) -- MOS01 0203 C371 7C = GS:SHR:&8-CODORG:SHL:&4+&10-&4 ;Queue 4 bytes (GS) -- MOS01 0204 C372 C7 = /(RS ) -- MOS01 0205 C373 4E = US:SHR:&8-CODORG:SHL:&4+&10-&2 ;Queue 2 bytes (US) -- MOS01 0206 C374 CF = /(DEL ) -- MOS01 0207 C375 -- MOS01 0208 C375 ;ROW OFFSETS FOR H.R.G. -- MOS01 0209 C375 -- MOS01 0210 C375 00 HRGTB = &00 -- MOS01 0211 C376 00 = &00 -- MOS01 0212 C377 02 = &02 -- MOS01 0213 C378 80 = &80 -- MOS01 0214 C379 05 = &05 -- MOS01 0215 C37A 00 = &00 -- MOS01 0216 C37B 07 = &07 -- MOS01 0217 C37C 80 = &80 -- MOS01 0218 C37D 0A = &0A -- MOS01 0219 C37E 00 = &00 -- MOS01 0220 C37F 0C = &0C -- MOS01 0221 C380 80 = &80 -- MOS01 0222 C381 0F = &0F -- MOS01 0223 C382 00 = &00 -- MOS01 0224 C383 11 = &11 -- MOS01 0225 C384 80 = &80 -- MOS01 0226 C385 14 = &14 -- MOS01 0227 C386 00 = &00 -- MOS01 0228 C387 16 = &16 -- MOS01 0229 C388 80 = &80 -- MOS01 0230 C389 19 = &19 -- MOS01 0231 C38A 00 = &00 -- MOS01 0232 C38B 1B = &1B -- MOS01 0233 C38C 80 = &80 -- MOS01 0234 C38D 1E = &1E -- MOS01 0235 C38E 00 = &00 -- MOS01 0236 C38F 20 = &20 -- MOS01 0237 C390 80 = &80 -- MOS01 0238 C391 23 = &23 -- MOS01 0239 C392 00 = &00 -- MOS01 0240 C393 25 = &25 -- MOS01 0241 C394 80 = &80 -- MOS01 0242 C395 28 = &28 -- MOS01 0243 C396 00 = &00 -- MOS01 0244 C397 2A = &2A -- MOS01 0245 C398 80 = &80 MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 6 MOS01 VDU File - MOS01 MOS01 -- MOS01 0246 C399 2D = &2D -- MOS01 0247 C39A 00 = &00 -- MOS01 0248 C39B 2F = &2F -- MOS01 0249 C39C 80 = &80 -- MOS01 0250 C39D 32 = &32 -- MOS01 0251 C39E 00 = &00 -- MOS01 0252 C39F 34 = &34 -- MOS01 0253 C3A0 80 = &80 -- MOS01 0254 C3A1 37 = &37 -- MOS01 0255 C3A2 00 = &00 -- MOS01 0256 C3A3 39 = &39 -- MOS01 0257 C3A4 80 = &80 -- MOS01 0258 C3A5 3C = &3C -- MOS01 0259 C3A6 00 = &00 -- MOS01 0260 C3A7 3E = &3E -- MOS01 0261 C3A8 80 = &80 -- MOS01 0262 C3A9 41 = &41 -- MOS01 0263 C3AA 00 = &00 -- MOS01 0264 C3AB 43 = &43 -- MOS01 0265 C3AC 80 = &80 -- MOS01 0266 C3AD 46 = &46 -- MOS01 0267 C3AE 00 = &00 -- MOS01 0268 C3AF 48 = &48 -- MOS01 0269 C3B0 80 = &80 -- MOS01 0270 C3B1 4B = &4B -- MOS01 0271 C3B2 00 = &00 -- MOS01 0272 C3B3 4D = &4D -- MOS01 0273 C3B4 80 = &80 -- MOS01 0274 C3B5 -- MOS01 0275 C3B5 ;ROW OFFSET TABLE FOR TELETEXT -- MOS01 0276 C3B5 -- MOS01 0277 C3B5 00 TXTTB = &00 -- MOS01 0278 C3B6 00 = &00 -- MOS01 0279 C3B7 00 = &00 -- MOS01 0280 C3B8 28 = &28 -- MOS01 0281 C3B9 00 = &00 -- MOS01 0282 C3BA 50 = &50 -- MOS01 0283 C3BB 00 = &00 -- MOS01 0284 C3BC 78 = &78 -- MOS01 0285 C3BD 00 = &00 -- MOS01 0286 C3BE A0 = &A0 -- MOS01 0287 C3BF 00 = &00 -- MOS01 0288 C3C0 C8 = &C8 -- MOS01 0289 C3C1 00 = &00 -- MOS01 0290 C3C2 F0 = &F0 -- MOS01 0291 C3C3 01 = &01 -- MOS01 0292 C3C4 18 = &18 -- MOS01 0293 C3C5 01 = &01 -- MOS01 0294 C3C6 40 = &40 -- MOS01 0295 C3C7 01 = &01 -- MOS01 0296 C3C8 68 = &68 -- MOS01 0297 C3C9 01 = &01 -- MOS01 0298 C3CA 90 = &90 -- MOS01 0299 C3CB 01 = &01 -- MOS01 0300 C3CC B8 = &B8 -- MOS01 0301 C3CD 01 = &01 -- MOS01 0302 C3CE E0 = &E0 -- MOS01 0303 C3CF 02 = &02 -- MOS01 0304 C3D0 08 = &08 -- MOS01 0305 C3D1 02 = &02 -- MOS01 0306 C3D2 30 = &30 -- MOS01 0307 C3D3 02 = &02 -- MOS01 0308 C3D4 58 = &58 -- MOS01 0309 C3D5 02 = &02 -- MOS01 0310 C3D6 80 = &80 -- MOS01 0311 C3D7 02 = &02 -- MOS01 0312 C3D8 A8 = &A8 -- MOS01 0313 C3D9 02 = &02 -- MOS01 0314 C3DA D0 = &D0 -- MOS01 0315 C3DB 02 = &02 -- MOS01 0316 C3DC F8 = &F8 -- MOS01 0317 C3DD 03 = &03 -- MOS01 0318 C3DE 20 = &20 -- MOS01 0319 C3DF 03 = &03 -- MOS01 0320 C3E0 48 = &48 -- MOS01 0321 C3E1 03 = &03 -- MOS01 0322 C3E2 70 = &70 -- MOS01 0323 C3E3 03 = &03 -- MOS01 0324 C3E4 98 = &98 -- MOS01 0325 C3E5 03 = &03 -- MOS01 0326 C3E6 C0 = &C0 -- MOS01 0327 C3E7 -- MOS01 0328 C3E7 ;NO. ROWS IN EACH MEMORY MODE -- MOS01 0329 C3E7 -- MOS01 0330 C3E7 1F PROWS = &1F -- MOS01 0331 C3E8 1F = &1F -- MOS01 0332 C3E9 1F = &1F -- MOS01 0333 C3EA 18 = &18 -- MOS01 0334 C3EB 1F = &1F -- MOS01 0335 C3EC 1F = &1F -- MOS01 0336 C3ED 18 = &18 -- MOS01 0337 C3EE 18 = &18 -- MOS01 0338 C3EF -- MOS01 0339 C3EF ;NO. COLS. IN EACH MEMORY MODE -- MOS01 0340 C3EF -- MOS01 0341 C3EF 4F PCOLS = &4F -- MOS01 0342 C3F0 27 = &27 -- MOS01 0343 C3F1 13 = &13 -- MOS01 0344 C3F2 4F = &4F -- MOS01 0345 C3F3 27 = &27 -- MOS01 0346 C3F4 13 = &13 -- MOS01 0347 C3F5 27 = &27 -- MOS01 0348 C3F6 27 = &27 -- MOS01 0349 C3F7 -- MOS01 0350 C3F7 ;BYTES TO BE LOADED INTO mMODREG FOR DIFFERENT MODES -- MOS01 0351 C3F7 -- MOS01 0352 C3F7 9C INDMOD = &9C -- MOS01 0353 C3F8 D8 = &D8 -- MOS01 0354 C3F9 F4 = &F4 -- MOS01 0355 C3FA 9C = &9C -- MOS01 0356 C3FB 88 = &88 -- MOS01 0357 C3FC C4 = &C4 -- MOS01 0358 C3FD 88 = &88 -- MOS01 0359 C3FE 4B = &4B -- MOS01 0360 C3FF -- MOS01 0361 C3FF ;BYTES PER CHARACTER -- MOS01 0362 C3FF ;IN EACH MODE -- MOS01 0363 C3FF -- MOS01 0364 C3FF 08 BYTCHT = &08 -- MOS01 0365 C400 10 = &10 -- MOS01 0366 C401 20 = &20 MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 7 MOS01 VDU File - MOS01 MOS01 -- MOS01 0367 C402 08 = &08 -- MOS01 0368 C403 08 = &08 -- MOS01 0369 C404 10 = &10 -- MOS01 0370 C405 08 = &08 -- MOS01 0371 C406 01 = &01 -- MOS01 0372 C407 -- MOS01 0373 C407 ;MASK TABLES - must be contiguous -- MOS01 0374 C407 -- MOS01 0375 C407 ;For each mode, the masks of each pixel, MS first -- MOS01 0376 C407 ;Note that it is now assumed that adjacent masks may be generated -- MOS01 0377 C407 ;by either ASL or LSR. -- MOS01 0378 C407 -- MOS01 0379 C407 ;SIXTEEN colour mode -- MOS01 0380 C407 -- MOS01 0381 C407 AA MASKTB = &AA -- MOS01 0382 C408 55 = &55 -- MOS01 0383 C409 -- MOS01 0384 C409 ;FOUR colour mode -- MOS01 0385 C409 88 = &88 -- MOS01 0386 C40A 44 = &44 -- MOS01 0387 C40B 22 = &22 -- MOS01 0388 C40C 11 = &11 -- MOS01 0389 C40D -- MOS01 0390 C40D ;TWO colour mode -- MOS01 0391 C40D -- MOS01 0392 C40D 80 BITTBL = &80 -- MOS01 0393 C40E 40 = &40 -- MOS01 0394 C40F 20 = &20 -- MOS01 0395 C410 10 = &10 -- MOS01 0396 C411 08 = &08 -- MOS01 0397 C412 04 = &04 -- MOS01 0398 C413 -- MOS01 0399 C413 02 = &02 ;**** NEXT 3 BYTES USED BY CFS **** -- MOS01 0400 C414 ;Uses $01 of next table -- MOS01 0401 C414 -- MOS01 0402 C414 ;COLOURS AVAILABLE FOR MODES -- MOS01 0403 C414 -- MOS01 0404 C414 01 COLMOD = &01 -- MOS01 0405 C415 03 = &03 -- MOS01 0406 C416 0F = &0F -- MOS01 0407 C417 -- MOS01 0408 C417 01 = &01 ;**** NEXT 3 BYTES USED BY CFS **** -- MOS01 0409 C418 01 = &01 -- MOS01 0410 C419 03 = &03 -- MOS01 0411 C41A 01 = &01 -- MOS01 0412 C41B ;TTX - must be 0 - uses 1st byte of next table -- MOS01 0413 C41B -- MOS01 0414 C41B ;Bytes for forming ZGORA & ZGEOR -- MOS01 0415 C41B ;Tables have been run into each other to save bytes. -- MOS01 0416 C41B ;They should be as follows -- MOS01 0417 C41B -- MOS01 0418 C41B ;TBZGOO OR the OR :- $FF,$00,$00,$FF,$FF,$FF -- MOS01 0419 C41B ;TBZGEO EOR the OR :- $00,$00,$FF,$FF,$FF,$FF -- MOS01 0420 C41B ;TBZGOE OR the EOR :- $00,$FF,$00,$00,$FF,$FF -- MOS01 0421 C41B ;TBZGEE EOR the EOR :- $FF,$FF,$FF,$00,$00,$FF -- MOS01 0422 C41B -- MOS01 0423 C41B ;These are for the colour modes 0 to 5, being -- MOS01 0424 C41B ;0=Store,1=OR,2=AND,3=EOR,4=Invert,5=No change -- MOS01 0425 C41B -- MOS01 0426 C41B 00 TBZGOE = &00 -- MOS01 0427 C41C FF TBZGOO = &FF -- MOS01 0428 C41D 00 TBZGEO = &00 -- MOS01 0429 C41E 00 = &00 -- MOS01 0430 C41F FF = &FF -- MOS01 0431 C420 FF TBZGEE = &FF -- MOS01 0432 C421 FF = &FF -- MOS01 0433 C422 FF = &FF -- MOS01 0434 C423 00 = &00 ;Uses next $00, $FF -- MOS01 0435 C424 -- MOS01 0436 C424 ;~~~ COLOUR TABLES ~~~ -- MOS01 0437 C424 -- MOS01 0438 C424 ;FULL COLOUR TABLES -- MOS01 0439 C424 ;Tables of 'full colours', -- MOS01 0440 C424 ;i.e. of bytes with all bits -- MOS01 0441 C424 ;set to 1 colour, in ascending -- MOS01 0442 C424 ;colour order -- MOS01 0443 C424 -- MOS01 0444 C424 00 FCOLTB = &00 ;Two colour table -- MOS01 0445 C425 FF = &FF -- MOS01 0446 C426 -- MOS01 0447 C426 ;Four colour table -- MOS01 0448 C426 -- MOS01 0449 C426 00 = &00 -- MOS01 0450 C427 0F = &0F -- MOS01 0451 C428 F0 = &F0 -- MOS01 0452 C429 FF = &FF -- MOS01 0453 C42A -- MOS01 0454 C42A ;Sixteen colour table -- MOS01 0455 C42A -- MOS01 0456 C42A 00 = &00 -- MOS01 0457 C42B 03 = &03 -- MOS01 0458 C42C 0C = &0C -- MOS01 0459 C42D 0F = &0F -- MOS01 0460 C42E 30 = &30 -- MOS01 0461 C42F 33 = &33 -- MOS01 0462 C430 3C = &3C -- MOS01 0463 C431 3F = &3F ;INVSXT This byte used to invert graphics pixels -- MOS01 0464 C432 C0 = &C0 -- MOS01 0465 C433 C3 = &C3 -- MOS01 0466 C434 CC = &CC -- MOS01 0467 C435 CF = &CF -- MOS01 0468 C436 F0 = &F0 -- MOS01 0469 C437 F3 = &F3 -- MOS01 0470 C438 FC = &FC -- MOS01 0471 C439 FF = &FF -- MOS01 0472 C43A -- MOS01 0473 C43A ;TABLE FOR NPIX -- MOS01 0474 C43A -- MOS01 0475 C43A ;No. pixles per byte in each graphics mode -- MOS01 0476 C43A ;(0 if not graphics) -- MOS01 0477 C43A -- MOS01 0478 C43A 07 NPIXTB = &07 -- MOS01 0479 C43B 03 = &03 -- MOS01 0480 C43C 01 = &01 -- MOS01 0481 C43D 00 = &00 ;(Non graphics) -- MOS01 0482 C43E 07 = &07 -- MOS01 0483 C43F 03 = &03 -- MOS01 0484 C440 ;Non-graphics modes - use next 2 $00s -- MOS01 0485 C440 -- MOS01 0486 C440 ;MEMORY MAP TYPES -- MOS01 0487 C440 ;Index from MODE (0..7), to MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 8 MOS01 VDU File - MOS01 MOS01 -- MOS01 0488 C440 ;the following 5 element tables -- MOS01 0489 C440 -- MOS01 0490 C440 MODETB -- MOS01 0491 C440 00 = &00 -- MOS01 0492 C441 SOUNDV ;channel dependent period offset -- MOS01 0493 C441 C43D SCHOFF * SOUNDV -&04 -- MOS01 0494 C441 -- MOS01 0495 C441 00 = &00 -- MOS01 0496 C442 00 = &00 -- MOS01 0497 C443 01 = &01 -- MOS01 0498 C444 02 = &02 -- MOS01 0499 C445 02 = &02 -- MOS01 0500 C446 03 = &03 -- MOS01 0501 C447 ;Uses $04 of next table -- MOS01 0502 C447 -- MOS01 0503 C447 -- MOS01 0504 C447 ;EXIT WINDOW OFFSET TABLE -- MOS01 0505 C447 -- MOS01 0506 C447 04 EWTBA = &04 -- MOS01 0507 C448 00 = &00 -- MOS01 0508 C449 06 = &06 -- MOS01 0509 C44A 02 = &02 -- MOS01 0510 C44B -- MOS01 0511 C44B -- MOS01 0512 C44B ;C0 control table -- MOS01 0513 C44B ;C1 control table -- MOS01 0514 C44B -- MOS01 0515 C44B 0D CONE = &0D -- MOS01 0516 C44C 05 = &05 -- MOS01 0517 C44D 0D = &0D -- MOS01 0518 C44E 05 = &05 ;Uses next $04 -- MOS01 0519 C44F 04 CZERO = &04 -- MOS01 0520 C450 04 = &04 -- MOS01 0521 C451 0C = &0C -- MOS01 0522 C452 0C = &0C -- MOS01 0523 C453 04 = &04 -- MOS01 0524 C454 -- MOS01 0525 C454 ;TABLES OF JUMP VECTORS -- MOS01 0526 C454 ;FOR CLEAR SCREEN -- MOS01 0527 C454 -- MOS01 0528 C454 07 CLSCTA = CLASCA ;(LSB) -- MOS01 0529 C455 37 = CLASCB -- MOS01 0530 C456 7F = CLASCC -- MOS01 0531 C457 97 = CLASCD -- MOS01 0532 C458 EB = CLASCE -- MOS01 0533 C459 -- MOS01 0534 C459 ;CLSCTB = CLASCA / ;(MSB) -- MOS01 0535 C459 ; = CLASCB / -- MOS01 0536 C459 ; = CLASCC / -- MOS01 0537 C459 ; = CLASCD / -- MOS01 0538 C459 ; = CLASCE / -- MOS01 0539 C459 -- MOS01 0540 C459 ;NO. BYTES PER SCREEN (MSB) -- MOS01 0541 C459 -- MOS01 0542 C459 50 BYTSTA = &50 -- MOS01 0543 C45A 40 = &40 -- MOS01 0544 C45B 28 = &28 -- MOS01 0545 C45C 20 = &20 -- MOS01 0546 C45D 04 = &04 -- MOS01 0547 C45E -- MOS01 0548 C45E ;MSB OF SCREEN START -- MOS01 0549 C45E -- MOS01 0550 C45E 30 STSCTB = &30 -- MOS01 0551 C45F 40 = &40 -- MOS01 0552 C460 58 = &58 -- MOS01 0553 C461 60 = &60 -- MOS01 0554 C462 7C = &7C -- MOS01 0555 C463 -- MOS01 0556 C463 ;BYTE WIDTH TYPES -- MOS01 0557 C463 ;Index from MEMODE (0..4), to -- MOS01 0558 C463 ;the following 3 element tables -- MOS01 0559 C463 -- MOS01 0560 C463 ;Now replaced with LSRA -- MOS01 0561 C463 -- MOS01 0562 C463 ;LSB OF NO. BYTES PER ROW -- MOS01 0563 C463 -- MOS01 0564 C463 28 BYTRTA = &28 -- MOS01 0565 C464 40 = &40 -- MOS01 0566 C465 80 = &80 -- MOS01 0567 C466 -- MOS01 0568 C466 ;LSB OF SCREEN OFFSET TABLES -- MOS01 0569 C466 -- MOS01 0570 C466 B5 TBZTBA = TXTTB -- MOS01 0571 C467 75 = HRGTB -- MOS01 0572 C468 75 = HRGTB -- MOS01 0573 C469 -- MOS01 0574 C469 -- MOS01 0575 C469 ;CRTC TABLES -- MOS01 0576 C469 -- MOS01 0577 C469 ;INDEX FOR CRTC TABLES -- MOS01 0578 C469 -- MOS01 0579 C469 0B CRTCX = &0B -- MOS01 0580 C46A 17 = &17 -- MOS01 0581 C46B 23 = &23 -- MOS01 0582 C46C 2F = &2F -- MOS01 0583 C46D 3B = &3B -- MOS01 0584 C46E -- MOS01 0585 C46E ;CRTC TABLE FOR MODES 0-2 -- MOS01 0586 C46E -- MOS01 0587 C46E 7F CRTCTB = &7F -- MOS01 0588 C46F 50 = &50 -- MOS01 0589 C470 62 = &62 -- MOS01 0590 C471 28 = &28 ;VS=2 -- MOS01 0591 C472 26 = &26 -- MOS01 0592 C473 00 = &00 -- MOS01 0593 C474 20 = &20 -- MOS01 0594 C475 22 = &22 ;was $22 & then it was $23 -- MOS01 0595 C476 01 = &01 -- MOS01 0596 C477 07 = &07 -- MOS01 0597 C478 67 = &67 -- MOS01 0598 C479 08 = &08 -- MOS01 0599 C47A -- MOS01 0600 C47A ;CRTC TABLE FOR MODE 3 -- MOS01 0601 C47A -- MOS01 0602 C47A 7F = &7F -- MOS01 0603 C47B 50 = &50 -- MOS01 0604 C47C 62 = &62 -- MOS01 0605 C47D 28 = &28 ;VS=2 -- MOS01 0606 C47E 1E = &1E -- MOS01 0607 C47F 02 = &02 -- MOS01 0608 C480 19 = &19 MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 9 MOS01 VDU File - MOS01 MOS01 -- MOS01 0609 C481 1B = &1B ;was $1B & then it was $1C -- MOS01 0610 C482 01 = &01 -- MOS01 0611 C483 09 = &09 -- MOS01 0612 C484 67 = &67 -- MOS01 0613 C485 09 = &09 -- MOS01 0614 C486 -- MOS01 0615 C486 ;CRTC TABLE FOR MODES 4-5 -- MOS01 0616 C486 -- MOS01 0617 C486 3F = &3F -- MOS01 0618 C487 28 = &28 -- MOS01 0619 C488 31 = &31 -- MOS01 0620 C489 24 = &24 ;VS=2 -- MOS01 0621 C48A 26 = &26 -- MOS01 0622 C48B 00 = &00 -- MOS01 0623 C48C 20 = &20 -- MOS01 0624 C48D 22 = &22 ;was $22 & then it was $23 -- MOS01 0625 C48E 01 = &01 -- MOS01 0626 C48F 07 = &07 -- MOS01 0627 C490 67 = &67 -- MOS01 0628 C491 08 = &08 -- MOS01 0629 C492 -- MOS01 0630 C492 ;CRTC TABLE FOR MODE 6 -- MOS01 0631 C492 -- MOS01 0632 C492 3F = &3F -- MOS01 0633 C493 28 = &28 -- MOS01 0634 C494 31 = &31 -- MOS01 0635 C495 24 = &24 ;VS=2 -- MOS01 0636 C496 1E = &1E -- MOS01 0637 C497 02 = &02 -- MOS01 0638 C498 19 = &19 -- MOS01 0639 C499 1B = &1B ;was $1B & then it was $1C -- MOS01 0640 C49A 01 = &01 -- MOS01 0641 C49B 09 = &09 -- MOS01 0642 C49C 67 = &67 -- MOS01 0643 C49D 09 = &09 -- MOS01 0644 C49E -- MOS01 0645 C49E ;CRTC TABLE FOR MODE 7 -- MOS01 0646 C49E -- MOS01 0647 C49E 3F = &3F -- MOS01 0648 C49F 28 = &28 -- MOS01 0649 C4A0 33 = &33 -- MOS01 0650 C4A1 24 = &24 ;VS=2 -- MOS01 0651 C4A2 1E = &1E -- MOS01 0652 C4A3 02 = &02 -- MOS01 0653 C4A4 19 = &19 -- MOS01 0654 C4A5 1B = &1B ;was $1B & then it was $1C -- MOS01 0655 C4A6 93 = &93 -- MOS01 0656 C4A7 12 = &12 -- MOS01 0657 C4A8 72 = &72 -- MOS01 0658 C4A9 13 = &13 -- MOS01 0659 C4AA -- MOS01 0660 C4AA ;JUMP TABLES FOR PLOTTING ROUTINES -- MOS01 0661 C4AA -- MOS01 0662 C4AA 57 D1JTB = EA -- MOS01 0663 C4AB D3 = /(EA ) -- MOS01 0664 C4AC 4F = NA -- MOS01 0665 C4AD D3 = /(NA ) -- MOS01 0666 C4AE -- MOS01 0667 C4AE 3B D2JTBL = EB -- MOS01 0668 C4AF 45 = WB -- MOS01 0669 C4B0 13 = NB -- MOS01 0670 C4B1 1C = SB -- MOS01 0671 C4B2 -- MOS01 0672 C4B2 D3 D2JTBH = /(EB ) -- MOS01 0673 C4B3 D3 = /(WB ) -- MOS01 0674 C4B4 D3 = /(NB ) -- MOS01 0675 C4B5 D3 = /(SB ) -- MOS01 0676 C4B6 -- MOS01 0677 C4B6 -- MOS01 0678 C4B6 ;TELETEXT CONVERSION TABLE -- MOS01 0679 C4B6 -- MOS01 0680 C4B6 23 TTXTB = &23 -- MOS01 0681 C4B7 5F = &5F -- MOS01 0682 C4B8 60 = &60 -- MOS01 0683 C4B9 23 = &23 -- MOS01 0684 C4BA -- MOS01 0685 C4BA -- MOS01 0686 C4BA ; font table -- MOS01 0687 C4BA -- MOS01 0688 C4BA FFSZOT ;Four,Five,Six,Zero,One,Two -- MOS01 0689 C4BA 04 = &04 -- MOS01 0690 C4BB 05 = &05 -- MOS01 0691 C4BC 06 = &06 -- MOS01 0692 C4BD 00 = &00 -- MOS01 0693 C4BE 01 = &01 -- MOS01 0694 C4BF 02 = &02 -- MOS01 0695 C4C0 -- MOS01 0696 C4C0 -- MOS01 0697 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 67 C5 JSR CSWAP ;Yes?, then swap cursors MOS02 0017 C4C3 v31 MOS02 0021 C4CC 20 60 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 AA 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 13 BEQ ISDEL MOS02 0017 C4C3 v31 MOS02 0028 C4DC C9 20 CMPIM &20 MOS02 0017 C4C3 v31 MOS02 0029 C4DE 90 11 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 A7 CF JSR VDUPR ;No?, then print to VDU MOS02 0017 C4C3 v31 MOS02 0033 C4E7 20 63 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 10 71 BPL CSWDEX ;& ditto MOS02 0040 C4ED v0E MOS02 0041 C4EF ] MOS02 0040 C4ED v0E MOS02 0042 C4EF MOS02 0040 C4ED v0E MOS02 0043 C4EF A9 20 ISDEL LDAIM &20 ;(Form correct index for DEL) MOS02 0040 C4ED v0E MOS02 0044 C4F1 MOS02 0040 C4ED v0E MOS02 0045 C4F1 A8 NOTDEL TAY MOS02 0040 C4ED v0E MOS02 0046 C4F2 B9 33 C3 LDAAY JTBLO ;Get LSByte of jump vector MOS02 0040 C4ED v0E MOS02 0047 C4F5 8D 5D 03 STA JVEC MOS02 0040 C4ED v0E MOS02 0048 C4F8 B9 54 C3 LDAAY JTBHI ;Get MSByte MOS02 0040 C4ED v0E MOS02 0049 C4FB 30 4A BMI REXEC ;No Qing required, so execute routine MOS02 0040 C4ED v0E MOS02 0050 C4FD AA TAX ;b7=0, so Q needed - set it up MOS02 0040 C4ED v0E MOS02 0051 C4FE 09 F0 ORAIM &F0 ;2's comp. of no. of bytes to Q MOS02 0040 C4ED v0E MOS02 0052 C500 8D 6A 02 STA QPOSN MOS02 0040 C4ED v0E MOS02 0053 C503 8A TXA ;Generate MSByte of address - MSNybble, plus CODORG MOS02 0040 C4ED v0E MOS02 0054 C504 4A LSRA MOS02 0040 C4ED v0E MOS02 0055 C505 4A LSRA MOS02 0040 C4ED v0E MOS02 0056 C506 4A LSRA MOS02 0040 C4ED v0E MOS02 0057 C507 4A LSRA MOS02 0040 C4ED v0E MOS02 0058 C508 18 CLC MOS02 0040 C4ED v0E MOS02 0059 C509 69 C3 ADCIM CODORG ;Forms the high byte of the vector MOS02 0040 C4ED v0E MOS02 0060 C50B 8D 5E 03 STA JVEC +&01 MOS02 0040 C4ED v0E MOS02 0061 C50E 24 D0 BIT STATS ;Swap back again if C.E. MOS02 0040 C4ED v0E MOS02 0062 C510 70 1E BVS NOTC10 MOS02 0040 C4ED v0E MOS02 0063 C512 [ MOS125 = &FF MOS02 0040 C4ED v0E MOS02 0065 C512 | MOS02 0040 C4ED v0E MOS02 0066 C512 ;adcim codorg never overflows (here...), C=0 MOS02 0040 C4ED v0E MOS02 0067 C512 ] MOS02 0040 C4ED v0E MOS02 0068 C512 60 ACK RTS ;NUL points at this to save a byte MOS02 0040 C4ED v0E MOS02 0069 C513 MOS02 0040 C4ED v0E MOS02 0070 C513 MOS02 0040 C4ED v0E MOS02 0071 C513 9D 24 02 QING STAAX QEND-&FF ;Q the byte MOS02 0040 C4ED v0E MOS02 0072 C516 E8 INX MOS02 0040 C4ED v0E MOS02 0073 C517 8E 6A 02 STX QPOSN ;(z preserved from INX) MOS02 0040 C4ED v0E MOS02 0074 C51A D0 17 BNE CLCEX ;More to do?, then exit MOS02 0040 C4ED v0E MOS02 0075 C51C 24 D0 BIT STATS ;Disabled?, then go away MOS02 0040 C4ED v0E MOS02 0076 C51E 30 15 BMI DISABL MOS02 0040 C4ED v0E MOS02 0077 C520 70 05 BVS NOTCEB ;C.E. mode, then do swapping MOS02 0040 C4ED v0E MOS02 0078 C522 20 FA CC JSR RUNNER MOS02 0040 C4ED v0E MOS02 0079 C525 18 CLC MOS02 0040 C4ED v0E MOS02 0080 C526 60 RTS MOS02 0040 C4ED v0E MOS02 0081 C527 MOS02 0040 C4ED v0E MOS02 0082 C527 20 67 C5 NOTCEB JSR CSWAP MOS02 0040 C4ED v0E MOS02 0083 C52A 20 60 CD JSR OCSRDL MOS02 0040 C4ED v0E MOS02 0084 C52D 20 FA CC JSR RUNNER MOS02 0040 C4ED v0E MOS02 0085 C530 20 64 C5 NOTC10 JSR REXE10 MOS02 0040 C4ED v0E MOS02 0086 C533 18 CLCEX CLC MOS02 0040 C4ED v0E MOS02 0087 C534 60 RTS MOS02 0040 C4ED v0E MOS02 0088 C535 MOS02 0040 C4ED v0E MOS02 0089 C535 AC 5E 03 DISABL LDY JVEC +&01 ;Was this an SOH ? MOS02 0040 C4ED v0E MOS02 0090 C538 C0 C5 CPYIM /(SOH ) MOS02 0040 C4ED v0E MOS02 0091 C53A D0 F7 BNE CLCEX ;No?, then go home MOS02 0040 C4ED v0E MOS02 0092 C53C MOS02 0040 C4ED v0E MOS02 0093 C53C AA SOH TAX ;Yes, then (A)=Byte to be printed MOS02 0040 C4ED v0E MOS02 0094 C53D A5 D0 LDA STATS ;Is printing enabled ? MOS02 0040 C4ED v0E MOS02 0095 C53F 4A LSRA MOS02 0040 C4ED v0E MOS02 0096 C540 90 D0 BCC ACK MOS02 0040 C4ED v0E MOS02 0097 C542 8A TXA MOS02 0040 C4ED v0E MOS02 0098 C543 [ MOS125 = &FF MOS02 0040 C4ED v0E MOS02 0099 C543 | MOS02 0040 C4ED v0E MOS02 0100 C543 18 CLC ;C=0, prevent second printing; PRINT preserves flags MOS02 0040 C4ED v0E MOS02 0101 C544 ] MOS02 0040 C4ED v0E MOS02 0102 C544 4C 70 E1 JMP PRINT ;print character and return, setting c=0 (done by MOS) MOS02 0040 C4ED v0E MOS02 0103 C547 MOS02 0040 C4ED v0E MOS02 0104 C547 [ MOS125 = &FF MOS02 0040 C4ED v0E MOS02 0127 C547 | MOS02 0040 C4ED v0E MOS02 0128 C547 REXEC ;starting +2 from NOTC20; 1 spare byte MOS02 0040 C4ED v0E MOS02 0129 C547 8D 5E 03 STA JVEC +&01 MOS02 0040 C4ED v0E MOS02 0130 C54A A5 D0 LDA STATS MOS02 0040 C4ED v0E MOS02 0131 C54C 6A RORA ;Is printer module on? MOS02 0040 C4ED v0E MOS02 0132 C54D 98 TYA ;AND Is it range $08 to $0D ? (no longer include bell) MOS02 0040 C4ED v0E MOS02 0133 C54E 6A RORA ;+4 = +6 MOS02 0040 C4ED v0E MOS02 0134 C54F C9 84 CMPIM &84 MOS02 0040 C4ED v0E MOS02 0135 C551 49 FF EORIM &FF MOS02 0040 C4ED v0E MOS02 0136 C553 6A RORA MOS02 0040 C4ED v0E MOS02 0137 C554 69 43 ADCIM &43 MOS02 0040 C4ED v0E MOS02 0138 C556 98 TYA ;-2 = +4 MOS02 0040 C4ED v0E MOS02 0139 C557 ; MOS02 0040 C4ED v0E MOS02 0140 C557 24 D0 BIT STATS ;Execute routine - are we disabled ? MOS02 0040 C4ED v0E MOS02 0141 C559 30 24 BMI ACKQ ;Was it an ACK? (can't be an SOH cos she queues) MOS02 0040 C4ED v0E MOS02 0142 C55B ; MOS02 0040 C4ED v0E MOS02 0143 C55B 08 PHP ;and push c MOS02 0040 C4ED v0E MOS02 0144 C55C 20 FA CC JSR RUNNER ;Do the routine MOS02 0040 C4ED v0E MOS02 0145 C55F 28 PLP MOS02 0040 C4ED v0E MOS02 0146 C560 CSWDEX ;enter with C=printer module on ;-5 = -1; 4 spare bytes MOS02 0040 C4ED v0E MOS02 0147 C560 24 D0 BIT STATS ;Following preserves c MOS02 0148 C562 ^2E MOS02 0148 C562 50 AE BVC ACK ;Not C.E. so exit MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 11 MOS02 VDU File - MOS02 MOS02 MOS02 0141 C559 v5B MOS02 0149 C564 20 70 CD REXE10 JSR OCSRWR ;Write output cursor MOS02 0141 C559 v5B MOS02 0150 C567 ] MOS02 0141 C559 v5B MOS02 0151 C567 MOS02 0141 C559 v5B MOS02 0152 C567 ;CSWAP - swap input and output text cursors MOS02 0141 C559 v5B MOS02 0153 C567 ; invert b1 of STATS MOS02 0141 C559 v5B MOS02 0154 C567 MOS02 0141 C559 v5B MOS02 0155 C567 08 CSWAP PHP ;Preserve carry MOS02 0141 C559 v5B MOS02 0156 C568 48 PHA MOS02 0141 C559 v5B MOS02 0157 C569 A2 18 LDXIM CSX-V MOS02 0141 C559 v5B MOS02 0158 C56B A0 64 LDYIM PCSX-V MOS02 0141 C559 v5B MOS02 0159 C56D 20 CC CD JSR SWAP2 MOS02 0141 C559 v5B MOS02 0160 C570 20 09 CF JSR TADDRY ;Address this point MOS02 0141 C559 v5B MOS02 0161 C573 20 D8 C9 JSR CSDSP MOS02 0141 C559 v5B MOS02 0162 C576 A5 D0 LDA STATS MOS02 0141 C559 v5B MOS02 0163 C578 49 02 EORIM &02 ;Invert bit 1 of STATS MOS02 0141 C559 v5B MOS02 0164 C57A 85 D0 STA STATS MOS02 0141 C559 v5B MOS02 0165 C57C 68 PLA MOS02 0141 C559 v5B MOS02 0166 C57D 28 PLP ;Restore c MOS02 0141 C559 v5B MOS02 0167 C57E 60 RTS MOS02 0141 C559 v5B MOS02 0168 C57F MOS02 0141 C559 v5B MOS02 0169 C57F ACKQ MOS02 0141 C559 v5B MOS02 0170 C57F ; C=0 => character not printable, C=1 => printable MOS02 0141 C559 v5B MOS02 0171 C57F 49 06 EORIM ACKASC ;Was it an ACK ? -- MOS02 0172 C581 D0 08 BNE VDURTS ;[not ACK] MOS02 0172 C581 v77 MOS02 0173 C583 ; MOS02 0172 C581 v77 MOS02 0174 C583 ; C=0 cos ACK not printable MOS02 0172 C581 v77 MOS02 0175 C583 A9 7F LDAIM &7F ;Yes?, then clear b7 of STATS MOS02 0172 C581 v77 MOS02 0176 C585 90 20 BCC STTAND ;always jump MOS02 0176 C585 v5F MOS02 0177 C587 MOS02 0176 C585 v5F MOS02 0178 C587 MOS02 0176 C585 v5F MOS02 0179 C587 MOS02 0176 C585 v5F MOS02 0180 C587 ;Test to see if printable ($20-$7E or $80-$FF) MOS02 0176 C585 v5F MOS02 0181 C587 ;Returns c=1 iff printable, c=0 otherwise MOS02 0176 C585 v5F MOS02 0182 C587 MOS02 0176 C585 v5F MOS02 0183 C587 MOS02 0176 C585 v5F MOS02 0184 C587 ;ANOMQ Returns z=0 iff cursors joined MOS02 0176 C585 v5F MOS02 0185 C587 MOS02 0176 C585 v5F MOS02 0186 C587 A5 D0 ANOMQ LDA STATS MOS02 0176 C585 v5F MOS02 0187 C589 29 20 ANDIM &20 ;Is b5 set ? (Answer to z) MOS02 0176 C585 v5F MOS02 0188 C58B VDURTS MOS02 0176 C585 v5F MOS02 0189 C58B 60 RTS ;Returns(A)=0 if b5 clear MOS02 0176 C585 v5F MOS02 0190 C58C MOS02 0176 C585 v5F MOS02 0191 C58C ;INDIVIDUAL ROUTINES MOS02 0176 C585 v5F MOS02 0192 C58C MOS02 0176 C585 v5F MOS02 0193 C58C ;NUL ($00) - do nothing MOS02 0176 C585 v5F MOS02 0194 C58C MOS02 0176 C585 v5F MOS02 0195 C58C ;Jump table points to ACK, an RTS, to save a byte MOS02 0176 C585 v5F MOS02 0196 C58C MOS02 0176 C585 v5F MOS02 0197 C58C ;SOH ($01) - Next char to printer MOS02 0176 C585 v5F MOS02 0198 C58C MOS02 0176 C585 v5F MOS02 0199 C58C ;This is taken care of above MOS02 0176 C585 v5F MOS02 0200 C58C MOS02 0176 C585 v5F MOS02 0201 C58C MOS02 0176 C585 v5F MOS02 0202 C58C ;SO ($0E) - Page mode on MOS02 0176 C585 v5F MOS02 0203 C58C MOS02 0176 C585 v5F MOS02 0204 C58C A0 00 SO LDYIM &00 ;Initialise LINES MOS02 0176 C585 v5F MOS02 0205 C58E 8C 69 02 STY LINES MOS02 0176 C585 v5F MOS02 0206 C591 A9 04 LDAIM &04 ;Set b2 of STATS MOS02 0176 C585 v5F MOS02 0207 C593 D0 07 BNE STTOR MOS02 0176 C585 v5F MOS02 0208 C595 MOS02 0176 C585 v5F MOS02 0209 C595 ;SI ($0F) - Page mode OFF MOS02 0176 C585 v5F MOS02 0210 C595 ; This is frigged below MOS02 0176 C585 v5F MOS02 0211 C595 MOS02 0176 C585 v5F MOS02 0212 C595 ;STX ($02) - Start printer MOS02 0176 C585 v5F MOS02 0213 C595 MOS02 0176 C585 v5F MOS02 0214 C595 20 F2 E1 STX JSR mUPT ;inform network (A assumed to contain $02) MOS02 0176 C585 v5F MOS02 0215 C598 A9 94 LDAIM &94 ;Set bit 0 of STATS. This maps to $01 MOS02 0176 C585 v5F MOS02 0216 C59A MOS02 0176 C585 v5F MOS02 0217 C59A ;NAK ($15) - Turn VDU off MOS02 0176 C585 v5F MOS02 0218 C59A MOS02 0176 C585 v5F MOS02 0219 C59A 49 95 NAK EORIM &95 ;Set b7 of STATS. Map $15 to $80 MOS02 0176 C585 v5F MOS02 0220 C59C MOS02 0176 C585 v5F MOS02 0221 C59C 05 D0 STTOR ORA STATS MOS02 0254 C5C2 ^58 MOS02 0222 C59E D0 09 BNE STTEXT ;(branch always taken unless ORed with 0) MOS02 0254 C5C2 ^58 MOS02 0223 C5A0 MOS02 0254 C5C2 ^58 MOS02 0224 C5A0 MOS02 0254 C5C2 ^58 MOS02 0225 C5A0 ;ETX ($03) - Stop printer MOS02 0254 C5C2 ^58 MOS02 0226 C5A0 MOS02 0254 C5C2 ^58 MOS02 0227 C5A0 20 F2 E1 ETX JSR mUPT ;inform network (A assumed to contain $03) MOS02 0254 C5C2 ^58 MOS02 0228 C5A3 A9 0A LDAIM &0A ;clear bit 0 of STATS. Maps $0A on to $FE MOS02 0254 C5C2 ^58 MOS02 0229 C5A5 MOS02 0254 C5C2 ^58 MOS02 0230 C5A5 49 F4 SI EORIM &F4 ;Clears b2 of STATS. Maps $0F on to $FB MOS02 0254 C5C2 ^58 MOS02 0231 C5A7 MOS02 0254 C5C2 ^58 MOS02 0232 C5A7 25 D0 STTAND AND STATS MOS02 0254 C5C2 ^58 MOS02 0233 C5A9 85 D0 STTEXT STA STATS MOS02 0254 C5C2 ^58 MOS02 0234 C5AB 60 EOTEXT RTS MOS02 0254 C5C2 ^58 MOS02 0235 C5AC MOS02 0254 C5C2 ^58 MOS02 0236 C5AC MOS02 0254 C5C2 ^58 MOS02 0237 C5AC ;EOT ($04) - Separate cursors MOS02 0254 C5C2 ^58 MOS02 0238 C5AC MOS02 0254 C5C2 ^58 MOS02 0239 C5AC AD 61 03 EOT LDA NPIX ;Is this a graphics mode ? MOS02 0254 C5C2 ^58 MOS02 0240 C5AF F0 FA BEQ EOTEXT ;NO, then return MOS02 0254 C5C2 ^58 MOS02 0241 C5B1 20 27 C9 JSR ETCA ;Redisplay old cursor MOS02 0254 C5C2 ^58 MOS02 0242 C5B4 A9 DF LDAIM &DF ;Clear b5 of STATS MOS02 0254 C5C2 ^58 MOS02 0243 C5B6 D0 EF BNE STTAND ;(branch always taken) MOS02 0254 C5C2 ^58 MOS02 0244 C5B8 MOS02 0254 C5C2 ^58 MOS02 0245 C5B8 ;ENQ ($05) - Join cursors MOS02 0254 C5C2 ^58 MOS02 0246 C5B8 ;Store & hide current cursor MOS02 0254 C5C2 ^58 MOS02 0247 C5B8 ;Set bit 5 of STATS MOS02 0254 C5C2 ^58 MOS02 0248 C5B8 MOS02 0254 C5C2 ^58 MOS02 0249 C5B8 AD 61 03 ENQ LDA NPIX ;Is this a graphics mode ? MOS02 0254 C5C2 ^58 MOS02 0250 C5BB F0 EE BEQ EOTEXT ;NO, then return MOS02 0254 C5C2 ^58 MOS02 0251 C5BD ;Access R10 OF 6845. NB cannot do this through CRTCP. MOS02 0254 C5C2 ^58 MOS02 0252 C5BD A9 20 LDAIM &20 ;Hide cursor MOS02 0254 C5C2 ^58 MOS02 0253 C5BF 20 2A C9 JSR ETCB ; Preserves flags MOS02 0254 C5C2 ^58 MOS02 0254 C5C2 D0 D8 BNE STTOR ;Set bit 5 of STATS, (A) preserved by ETCB -- MOS02 0255 C5C4 -- MOS02 0256 C5C4 ;ACK ($06) - Turn VDU drivers on again -- MOS02 0257 C5C4 ;Clear bit 7 of STATS -- MOS02 0258 C5C4 -- MOS02 0259 C5C4 ;Taken care of above -- MOS02 0260 C5C4 -- MOS02 0261 C5C4 ;BELL ($07) - Ring BELL -- MOS02 0262 C5C4 -- MOS02 0263 C5C4 ;The routine BELL is externally declared in file UADE90 -- MOS02 0264 C5C4 -- MOS02 0265 C5C4 ;Cursor primitives -- MOS02 0266 C5C4 -- MOS02 0267 C5C4 ;BS ($08) - Cursor left 1 character position -- MOS02 0268 C5C4 -- MOS02 0269 C5C4 20 87 C5 BS JSR ANOMQ MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 12 MOS02 VDU File - MOS02 MOS02 -- MOS02 0270 C5C7 D0 55 BNE CSAL MOS02 0270 C5C7 v2A MOS02 0271 C5C9 MOS02 0270 C5C7 v2A MOS02 0272 C5C9 ;Cursor left MOS02 0270 C5C7 v2A MOS02 0273 C5C9 MOS02 0270 C5C7 v2A MOS02 0274 C5C9 CE 18 03 CSL DEC CSX MOS02 0270 C5C7 v2A MOS02 0275 C5CC AE 18 03 LDX CSX ;Over LH margin ? MOS02 0270 C5C7 v2A MOS02 0276 C5CF EC 08 03 CPX TWLCOL MOS02 0270 C5C7 v2A MOS02 0277 C5D2 30 19 BMI CSLC ;Yes, then up (see below) a line MOS02 0270 C5C7 v2A MOS02 0278 C5D4 AD 4A 03 LDA CSPOSN ;Move cursor left MOS02 0270 C5C7 v2A MOS02 0279 C5D7 38 SEC MOS02 0270 C5C7 v2A MOS02 0280 C5D8 ED 4F 03 SBC BYTCH MOS02 0270 C5C7 v2A MOS02 0281 C5DB AA TAX MOS02 0270 C5C7 v2A MOS02 0282 C5DC AD 4B 03 LDA CSPOSN +&01 MOS02 0270 C5C7 v2A MOS02 0283 C5DF E9 00 SBCIM &00 MOS02 0270 C5C7 v2A MOS02 0284 C5E1 CD 4E 03 CMP BEGSCN ;Wraparound ? MOS02 0270 C5C7 v2A MOS02 0285 C5E4 B0 03 BCS CSLA MOS02 0270 C5C7 v2A MOS02 0286 C5E6 6D 54 03 ADC BYTSCN ;Yes, then add screen MOS02 0270 C5C7 v2A MOS02 0287 C5E9 A8 CSLA TAY MOS02 0270 C5C7 v2A MOS02 0288 C5EA 4C CC C9 JMP CSDSPA MOS02 0270 C5C7 v2A MOS02 0289 C5ED MOS02 0270 C5C7 v2A MOS02 0290 C5ED AD 0A 03 CSLC LDA TWRCOL ;Put csr = RH edge MOS02 0270 C5C7 v2A MOS02 0291 C5F0 8D 18 03 STA CSX ;& fall through to ... MOS02 0270 C5C7 v2A MOS02 0292 C5F3 MOS02 0270 C5C7 v2A MOS02 0293 C5F3 ;Cursor up MOS02 0270 C5C7 v2A MOS02 0294 C5F3 MOS02 0270 C5C7 v2A MOS02 0295 C5F3 CE 69 02 CSU DEC LINES ;One more line to print before page mode occurs MOS02 0353 C65D ^14 MOS02 0296 C5F6 10 03 BPL CSUC MOS02 0353 C65D ^14 MOS02 0297 C5F8 EE 69 02 INC LINES ;At top of page, so don't go -ve! MOS02 0353 C65D ^14 MOS02 0298 C5FB AE 19 03 CSUC LDX CSY ;Cursor on top row ? MOS02 0353 C65D ^14 MOS02 0299 C5FE EC 0B 03 CPX TWTROW MOS02 0353 C65D ^14 MOS02 0300 C601 F0 06 BEQ CSUA ;Yes, then scroll MOS02 0353 C65D ^14 MOS02 0301 C603 CE 19 03 DEC CSY MOS02 0353 C65D ^14 MOS02 0302 C606 4C AE C6 JMP CSDA MOS02 0353 C65D ^14 MOS02 0303 C609 MOS02 0353 C65D ^14 MOS02 0304 C609 18 CSUA CLC MOS02 0353 C65D ^14 MOS02 0305 C60A 20 35 CD JSR ENSCRL ;Account for scroll disable MOS02 0353 C65D ^14 MOS02 0306 C60D A9 08 LDAIM &08 ;Test hard/soft flag MOS02 0353 C65D ^14 MOS02 0307 C60F 24 D0 BIT STATS MOS02 0353 C65D ^14 MOS02 0308 C611 D0 05 BNE CSUB ;S3 set, soft scroll MOS02 0353 C65D ^14 MOS02 0309 C613 20 6A C9 JSR HSCRDN ;S3 clear, hard scroll MOS02 0353 C65D ^14 MOS02 0310 C616 D0 03 BNE CSUD ; HSCRDN returns zero false MOS02 0353 C65D ^14 MOS02 0311 C618 20 93 CD CSUB JSR SSCRDN MOS02 0353 C65D ^14 MOS02 0312 C61B 4C AB C6 CSUD JMP CSDC MOS02 0353 C65D ^14 MOS02 0313 C61E A2 00 CSAL LDXIM &00 MOS02 0353 C65D ^14 MOS02 0314 C620 ; And fall through to MOS02 0353 C65D ^14 MOS02 0315 C620 MOS02 0353 C65D ^14 MOS02 0316 C620 ;Move graphics cursor 1 character - primitives. MOS02 0353 C65D ^14 MOS02 0317 C620 ;(X) = 0 if X cursor to be moved MOS02 0353 C65D ^14 MOS02 0318 C620 ; 2 if Y cursor to be moved MOS02 0353 C65D ^14 MOS02 0319 C620 ;Iff (X)=0, then if off window, LF/VT occurs MOS02 0353 C65D ^14 MOS02 0320 C620 ;If cursor crosses margin, then goes to opposite margin. MOS02 0353 C65D ^14 MOS02 0321 C620 ;Go down 1 character location MOS02 0353 C65D ^14 MOS02 0322 C620 MOS02 0353 C65D ^14 MOS02 0323 C620 86 DB GCSCHD STX ZTEMP +&01 ;Store offset MOS02 0353 C65D ^14 MOS02 0324 C622 20 1F D1 JSR WINDCS ;Window current cursor (result to ZTEMP) MOS02 0353 C65D ^14 MOS02 0325 C625 A6 DB LDX ZTEMP +&01 ;Subtract 8 from cursor MOS02 0353 C65D ^14 MOS02 0326 C627 38 SEC MOS02 0353 C65D ^14 MOS02 0327 C628 BD 24 03 LDAAX GCSIR MOS02 0353 C65D ^14 MOS02 0328 C62B E9 08 SBCIM &08 MOS02 0353 C65D ^14 MOS02 0329 C62D 9D 24 03 STAAX GCSIR MOS02 0353 C65D ^14 MOS02 0330 C630 B0 03 BCS GCSHDA MOS02 0353 C65D ^14 MOS02 0331 C632 DE 25 03 DECAX GCSIR+&01 MOS02 0353 C65D ^14 MOS02 0332 C635 A5 DA GCSHDA LDA ZTEMP ;Get window MOS02 0353 C65D ^14 MOS02 0333 C637 D0 1E BNE GCSHDB ;Out of window to begin with?, then skip MOS02 0353 C65D ^14 MOS02 0334 C639 20 1F D1 JSR WINDCS ;Window current point MOS02 0353 C65D ^14 MOS02 0335 C63C F0 19 BEQ GCSHDB ;Still inside? , then return MOS02 0353 C65D ^14 MOS02 0336 C63E A6 DB LDX ZTEMP +&01 ;Gone outside?, then go to high margin MOS02 0353 C65D ^14 MOS02 0337 C640 BD 04 03 LDAAX GWRCOL MOS02 0353 C65D ^14 MOS02 0338 C643 E0 01 CPXIM &01 ;Plot by X?, then back up 1 character MOS02 0353 C65D ^14 MOS02 0339 C645 B0 02 BCS GCSHDC MOS02 0353 C65D ^14 MOS02 0340 C647 E9 06 SBCIM &06 ;c=0. so subt. 7 to get char. just on screen MOS02 0353 C65D ^14 MOS02 0341 C649 9D 24 03 GCSHDC STAAX GCSIR MOS02 0353 C65D ^14 MOS02 0342 C64C BD 05 03 LDAAX GWRCOL+&01 MOS02 0353 C65D ^14 MOS02 0343 C64F E9 00 SBCIM &00 MOS02 0353 C65D ^14 MOS02 0344 C651 9D 25 03 STAAX GCSIR+&01 MOS02 0353 C65D ^14 MOS02 0345 C654 8A TXA ;Plot by X?, then go up a line as well MOS02 0353 C65D ^14 MOS02 0346 C655 F0 08 BEQ CSAU MOS02 0353 C65D ^14 MOS02 0347 C657 4C 7D CA GCSHDB JMP IEG MOS02 0419 C6D1 ^04 MOS02 0348 C65A MOS02 0419 C6D1 ^04 MOS02 0349 C65A MOS02 0419 C6D1 ^04 MOS02 0350 C65A ;VT ($0B) - Cursor up 1 character line MOS02 0419 C6D1 ^04 MOS02 0351 C65A MOS02 0419 C6D1 ^04 MOS02 0352 C65A 20 87 C5 VT JSR ANOMQ MOS02 0419 C6D1 ^04 MOS02 0353 C65D F0 94 BEQ CSU MOS02 0419 C6D1 ^04 MOS02 0354 C65F A2 02 CSAU LDXIM &02 MOS02 0419 C6D1 ^04 MOS02 0355 C661 D0 52 BNE GCSCHU ;(branch always taken) MOS02 0419 C6D1 ^04 MOS02 0356 C663 MOS02 0419 C6D1 ^04 MOS02 0357 C663 ;HT ($09) - Cursor right 1 character position MOS02 0419 C6D1 ^04 MOS02 0358 C663 MOS02 0419 C6D1 ^04 MOS02 0359 C663 A5 D0 HT LDA STATS ;Encode ANOMQ because this routine often referenced MOS02 0419 C6D1 ^04 MOS02 0360 C665 29 20 ANDIM &20 MOS02 0419 C6D1 ^04 MOS02 0361 C667 D0 4A BNE CSAR MOS02 0419 C6D1 ^04 MOS02 0362 C669 MOS02 0419 C6D1 ^04 MOS02 0363 C669 ;Cursor right MOS02 0419 C6D1 ^04 MOS02 0364 C669 MOS02 0419 C6D1 ^04 MOS02 0365 C669 AE 18 03 CSR LDX CSX ;Cursor over RH col ? MOS02 0419 C6D1 ^04 MOS02 0366 C66C EC 0A 03 CPX TWRCOL MOS02 0419 C6D1 ^04 MOS02 0367 C66F B0 12 BCS CSRC MOS02 0419 C6D1 ^04 MOS02 0368 C671 EE 18 03 INC CSX MOS02 0419 C6D1 ^04 MOS02 0369 C674 AD 4A 03 LDA CSPOSN MOS02 0419 C6D1 ^04 MOS02 0370 C677 6D 4F 03 ADC BYTCH ;Add no. bytes per char MOS02 0419 C6D1 ^04 MOS02 0371 C67A AA TAX MOS02 0419 C6D1 ^04 MOS02 0372 C67B AD 4B 03 LDA CSPOSN +&01 ;to posn. of csr. MOS02 0419 C6D1 ^04 MOS02 0373 C67E 69 00 ADCIM &00 ;sets n for test in CSDSPA MOS02 0419 C6D1 ^04 MOS02 0374 C680 4C CC C9 JMP CSDSPA MOS02 0419 C6D1 ^04 MOS02 0375 C683 AD 08 03 CSRC LDA TWLCOL ;Put csr = LH edge MOS02 0419 C6D1 ^04 MOS02 0376 C686 8D 18 03 STA CSX ;& fall through to ... MOS02 0419 C6D1 ^04 MOS02 0377 C689 MOS02 0419 C6D1 ^04 MOS02 0378 C689 ;Cursor down MOS02 0419 C6D1 ^04 MOS02 0379 C689 MOS02 0419 C6D1 ^04 MOS02 0380 C689 18 CSD CLC ;do not set LEDs on first test for page wait (MOS requirement) MOS02 0419 C6D1 ^04 MOS02 0381 C68A 20 C0 CA JSR PAGE ;Account for page mode MOS02 0419 C6D1 ^04 MOS02 0382 C68D AE 19 03 LDX CSY ;Is cursor off bottom? MOS02 0419 C6D1 ^04 MOS02 0383 C690 EC 09 03 CPX TWBROW MOS02 0419 C6D1 ^04 MOS02 0384 C693 B0 05 BCS CSDD ;Yes, then scroll MOS02 0419 C6D1 ^04 MOS02 0385 C695 EE 19 03 INC CSY ;No, then move down line MOS02 0419 C6D1 ^04 MOS02 0386 C698 90 14 BCC CSDA ;(branch always taken) MOS02 0419 C6D1 ^04 MOS02 0387 C69A MOS02 0419 C6D1 ^04 MOS02 0388 C69A 20 35 CD CSDD JSR ENSCRL ;Account for scroll disable MOS02 0419 C6D1 ^04 MOS02 0389 C69D A9 08 LDAIM &08 ;Test hard/soft flag MOS02 0419 C6D1 ^04 MOS02 0390 C69F 24 D0 BIT STATS MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 13 MOS02 VDU File - MOS02 MOS02 MOS02 0419 C6D1 ^04 MOS02 0391 C6A1 D0 05 BNE CSDB MOS02 0419 C6D1 ^04 MOS02 0392 C6A3 20 7A C9 JSR HSCRUP ;No windows set, so use hard scroll MOS02 0419 C6D1 ^04 MOS02 0393 C6A6 D0 03 BNE CSDC ; HSCRUP unsets zero MOS02 0419 C6D1 ^04 MOS02 0394 C6A8 20 00 CE CSDB JSR SSCRUP ;Windows set, so use soft scroll MOS02 0419 C6D1 ^04 MOS02 0395 C6AB 20 AC CE CSDC JSR CLTLIN ;Clear the line on which CSY lies MOS02 0419 C6D1 ^04 MOS02 0396 C6AE 20 09 CF CSDA JSR TADDRY ;address the cursor, point guaranteed in window MOS02 0419 C6D1 ^04 MOS02 0397 C6B1 90 7E BCC FSD ;and display it (TADDRY returns carry clear) MOS02 0397 C6B1 v01 MOS02 0398 C6B3 A2 00 CSAR LDXIM &00 MOS02 0397 C6B1 v01 MOS02 0399 C6B5 ; And fall through to MOS02 0397 C6B1 v01 MOS02 0400 C6B5 MOS02 0397 C6B1 v01 MOS02 0401 C6B5 ;Move graphics cursor 1 character - primitives. MOS02 0397 C6B1 v01 MOS02 0402 C6B5 ;(X) = 0 if Y cursor to be moved MOS02 0397 C6B1 v01 MOS02 0403 C6B5 ; 2 if X cursor to be moved MOS02 0397 C6B1 v01 MOS02 0404 C6B5 ;Iff (X)=0, then if off window, LF/VT occurs MOS02 0397 C6B1 v01 MOS02 0405 C6B5 ;If cursor crosses margin, then goes to opposite margin. MOS02 0397 C6B1 v01 MOS02 0406 C6B5 MOS02 0397 C6B1 v01 MOS02 0407 C6B5 86 DB GCSCHU STX ZTEMP +&01 ;Store offset MOS02 0397 C6B1 v01 MOS02 0408 C6B7 20 1F D1 JSR WINDCS ;Window current cursor (result to ZTEMP) MOS02 0397 C6B1 v01 MOS02 0409 C6BA A6 DB LDX ZTEMP +&01 ;Add 8 to cursor MOS02 0397 C6B1 v01 MOS02 0410 C6BC 18 CLC MOS02 0397 C6B1 v01 MOS02 0411 C6BD BD 24 03 LDAAX GCSIR MOS02 0397 C6B1 v01 MOS02 0412 C6C0 69 08 ADCIM &08 MOS02 0397 C6B1 v01 MOS02 0413 C6C2 9D 24 03 STAAX GCSIR MOS02 0397 C6B1 v01 MOS02 0414 C6C5 90 03 BCC GCSHUA MOS02 0397 C6B1 v01 MOS02 0415 C6C7 FE 25 03 INCAX GCSIR+&01 MOS02 0397 C6B1 v01 MOS02 0416 C6CA A5 DA GCSHUA LDA ZTEMP ;Get window MOS02 0397 C6B1 v01 MOS02 0417 C6CC D0 89 BNE GCSHDB ;Out of window to begin with?, then skip MOS02 0397 C6B1 v01 MOS02 0418 C6CE 20 1F D1 JSR WINDCS ;Window current point MOS02 0397 C6B1 v01 MOS02 0419 C6D1 F0 84 BEQ GCSHDB ;Still inside? , then return MOS02 0397 C6B1 v01 MOS02 0420 C6D3 A6 DB LDX ZTEMP +&01 ;Gone outside?, then go to low margin MOS02 0397 C6B1 v01 MOS02 0421 C6D5 BD 00 03 LDAAX GWLCOL MOS02 0397 C6B1 v01 MOS02 0422 C6D8 E0 01 CPXIM &01 ;Plot by Y?, then go up a line MOS02 0397 C6B1 v01 MOS02 0423 C6DA 90 02 BCC GCSHUC MOS02 0397 C6B1 v01 MOS02 0424 C6DC 69 06 ADCIM &06 ;c=1, so add 7 to get char. just on screen MOS02 0397 C6B1 v01 MOS02 0425 C6DE 9D 24 03 GCSHUC STAAX GCSIR MOS02 0397 C6B1 v01 MOS02 0426 C6E1 BD 01 03 LDAAX GWLCOL+&01 MOS02 0397 C6B1 v01 MOS02 0427 C6E4 69 00 ADCIM &00 MOS02 0397 C6B1 v01 MOS02 0428 C6E6 9D 25 03 STAAX GCSIR+&01 MOS02 0397 C6B1 v01 MOS02 0429 C6E9 8A TXA ;Plot by X? MOS02 0397 C6B1 v01 MOS02 0430 C6EA F0 08 BEQ CSAD ;Yes?, then go down a line as well MOS02 0397 C6B1 v01 MOS02 0431 C6EC 4C 7D CA JMP IEG ;No?, then exit MOS02 0397 C6B1 v01 MOS02 0432 C6EF MOS02 0397 C6B1 v01 MOS02 0433 C6EF MOS02 0397 C6B1 v01 MOS02 0434 C6EF ;LF ($0A) - Cursor down 1 character line MOS02 0397 C6B1 v01 MOS02 0435 C6EF MOS02 0397 C6B1 v01 MOS02 0436 C6EF 20 87 C5 LF JSR ANOMQ MOS02 0397 C6B1 v01 MOS02 0437 C6F2 F0 95 BEQ CSD MOS02 0397 C6B1 v01 MOS02 0438 C6F4 A2 02 CSAD LDXIM &02 MOS02 0397 C6B1 v01 MOS02 0439 C6F6 4C 20 C6 JMP GCSCHD MOS02 0397 C6B1 v01 MOS02 0440 C6F9 MOS02 0397 C6B1 v01 MOS02 0441 C6F9 ;FS ($1C) Define text area MOS02 0397 C6B1 v01 MOS02 0442 C6F9 MOS02 0397 C6B1 v01 MOS02 0443 C6F9 ;QEND-3 = L.H. margin = TWLCOL MOS02 0397 C6B1 v01 MOS02 0444 C6F9 ;QEND-2 = Bottom row = TWBROW MOS02 0397 C6B1 v01 MOS02 0445 C6F9 ;QEND-1 = R.H. margin = TWRCOL MOS02 0397 C6B1 v01 MOS02 0446 C6F9 ;QEND = Top row = TWTROW MOS02 0397 C6B1 v01 MOS02 0447 C6F9 MOS02 0397 C6B1 v01 MOS02 0448 C6F9 [ MOS125 = &FF MOS02 0397 C6B1 v01 MOS02 0464 C6F9 | MOS02 0397 C6B1 v01 MOS02 0465 C6F9 AE 55 03 FS LDX MODE MOS02 0397 C6B1 v01 MOS02 0466 C6FC AD 21 03 LDA QEND-&02 ;Do y co-ordinates. Get bottom (higher numbered) row MOS02 0397 C6B1 v01 MOS02 0467 C6FF CD 23 03 CMP QEND ;Top row above bottom ? MOS02 0397 C6B1 v01 MOS02 0468 C702 90 16 BCC FSF ;No?, then fail MOS02 0397 C6B1 v01 MOS02 0469 C704 DD E7 C3 CMPAX PROWS ;Is > max. no. rows? MOS02 0397 C6B1 v01 MOS02 0470 C707 F0 02 BEQ FSC MOS02 0397 C6B1 v01 MOS02 0471 C709 B0 09 BCS FSE ;Yes, then fail MOS02 0397 C6B1 v01 MOS02 0472 C70B AD 22 03 FSC LDA QEND-&01 ;Do x co-ordinates. Get RH margin MOS02 0397 C6B1 v01 MOS02 0473 C70E A8 TAY MOS02 0397 C6B1 v01 MOS02 0474 C70F DD EF C3 CMPAX PCOLS ;Is > than max. cols? MOS02 0397 C6B1 v01 MOS02 0475 C712 F0 02 BEQ FSB MOS02 0397 C6B1 v01 MOS02 0476 C714 FSE MOS02 0397 C6B1 v01 MOS02 0477 C714 B0 74 BCS PRACX ;Yes, then fail MOS02 0397 C6B1 v01 MOS02 0478 C716 38 FSB SEC MOS02 0397 C6B1 v01 MOS02 0479 C717 ED 20 03 SBC QEND-&03 ;How many cols. wide ? MOS02 0397 C6B1 v01 MOS02 0480 C71A FSF MOS02 0397 C6B1 v01 MOS02 0481 C71A 90 6E BCC PRACX ;Fail if -ve no. cols. MOS02 0397 C6B1 v01 MOS02 0482 C71C ] MOS02 0397 C6B1 v01 MOS02 0483 C71C A8 TAY MOS02 0397 C6B1 v01 MOS02 0484 C71D 20 5C CA JSR SETPWW ;Set PWWDTH MOS02 0397 C6B1 v01 MOS02 0485 C720 A9 08 LDAIM &08 ;Set bit 3 for soft scrolling MOS02 0397 C6B1 v01 MOS02 0486 C722 20 9C C5 JSR STTOR MOS02 0397 C6B1 v01 MOS02 0487 C725 A2 20 LDXIM QEND-&03-V ;copy Q to TWxxxx MOS02 0397 C6B1 v01 MOS02 0488 C727 A0 08 LDYIM TWLCOL-V MOS02 0397 C6B1 v01 MOS02 0489 C729 20 41 D4 JSR COPYF MOS02 0397 C6B1 v01 MOS02 0490 C72C 20 EB CE JSR TADDR ;Is cursor still inside MOS02 0397 C6B1 v01 MOS02 0491 C72F B0 33 BCS RS ;No, then home cursor MOS02 0397 C6B1 v01 MOS02 0492 C731 4C D8 C9 FSD JMP CSDSP MOS02 0603 C7AD ^02 MOS02 0493 C734 MOS02 0603 C7AD ^02 MOS02 0494 C734 RPXLXY MOS02 0603 C7AD ^02 MOS02 0495 C734 A0 03 LDYIM &03 ;~~~ Read pixel at (x,y) ~~~ MOS02 0603 C7AD ^02 MOS02 0496 C736 B1 F0 PRAAA LDAIY WARGS ;Copy (x,y) to RPXLWS ... MOS02 0603 C7AD ^02 MOS02 0497 C738 99 28 03 STAAY RPXLWS MOS02 0603 C7AD ^02 MOS02 0498 C73B 88 DEY MOS02 0603 C7AD ^02 MOS02 0499 C73C 10 F8 BPL PRAAA MOS02 0603 C7AD ^02 MOS02 0500 C73E A9 28 LDAIM RPXLWS-V ;Convert in internal co-ordinates MOS02 0603 C7AD ^02 MOS02 0501 C740 20 CE D7 JSR RPXLD ;Read pixel if extant MOS02 0603 C7AD ^02 MOS02 0502 C743 A0 04 LDYIM &04 ;Store in (XY) +4 MOS02 0603 C7AD ^02 MOS02 0503 C745 D0 3B BNE PRACB ;(branch always taken) MOS02 0603 C7AD ^02 MOS02 0504 C747 MOS02 0603 C7AD ^02 MOS02 0505 C747 [ MOS125 = &FF MOS02 0603 C7AD ^02 MOS02 0516 C747 ] MOS02 0603 C7AD ^02 MOS02 0517 C747 MOS02 0603 C7AD ^02 MOS02 0518 C747 ;FF ($0C) Form feed MOS02 0603 C7AD ^02 MOS02 0519 C747 MOS02 0603 C7AD ^02 MOS02 0520 C747 20 87 C5 FF JSR ANOMQ ;Cursors joined ? MOS02 0603 C7AD ^02 MOS02 0521 C74A D0 78 BNE FFANOM ;Yes, then clear graphics area MOS02 0603 C7AD ^02 MOS02 0522 C74C A5 D0 LDA STATS ;Window set ? MOS02 0603 C7AD ^02 MOS02 0523 C74E 29 08 ANDIM &08 ;Test bit 3 of STATS MOS02 0603 C7AD ^02 MOS02 0524 C750 [ MOS125 = &FF MOS02 0603 C7AD ^02 MOS02 0527 C750 | MOS02 0603 C7AD ^02 MOS02 0528 C750 F0 64 BEQ FFC ;Clear?, then fast clear MOS02 0603 C7AD ^02 MOS02 0529 C752 ] MOS02 0603 C7AD ^02 MOS02 0530 C752 AE 0B 03 FFA LDX TWTROW ;Initialise cursor to top row MOS02 0603 C7AD ^02 MOS02 0531 C755 8E 19 03 FFB STX CSY ;Clear this line MOS02 0603 C7AD ^02 MOS02 0532 C758 20 AC CE JSR CLTLIN MOS02 0603 C7AD ^02 MOS02 0533 C75B AE 19 03 LDX CSY ;Move down a line MOS02 0603 C7AD ^02 MOS02 0534 C75E EC 09 03 CPX TWBROW ;On the bottom ? MOS02 0603 C7AD ^02 MOS02 0535 C761 E8 INX MOS02 0603 C7AD ^02 MOS02 0536 C762 90 F1 BCC FFB ;(INX preserves c) MOS02 0603 C7AD ^02 MOS02 0537 C764 MOS02 0603 C7AD ^02 MOS02 0538 C764 ;& fall through to MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 14 MOS02 VDU File - MOS02 MOS02 MOS02 0603 C7AD ^02 MOS02 0539 C764 MOS02 0603 C7AD ^02 MOS02 0540 C764 MOS02 0603 C7AD ^02 MOS02 0541 C764 ;RS ($1E) Home character cursor MOS02 0603 C7AD ^02 MOS02 0542 C764 MOS02 0603 C7AD ^02 MOS02 0543 C764 20 87 C5 RS JSR ANOMQ MOS02 0603 C7AD ^02 MOS02 0544 C767 F0 22 BEQ RSA MOS02 0603 C7AD ^02 MOS02 0545 C769 [ MOS125 = &FF MOS02 0603 C7AD ^02 MOS02 0547 C769 | MOS02 0603 C7AD ^02 MOS02 0548 C769 ;RSAN Anomalous cursor home MOS02 0603 C7AD ^02 MOS02 0549 C769 MOS02 0603 C7AD ^02 MOS02 0550 C769 A2 06 RSAN LDXIM GWTROW-V ;Copy GWLCOL to GCSIR MOS02 0603 C7AD ^02 MOS02 0551 C76B A0 26 LDYIM GCSIY-V MOS02 0603 C7AD ^02 MOS02 0552 C76D 20 39 D4 JSR COPY2 ;Copy 4 bytes of RAM saves 2 bytes of ROM MOS02 0603 C7AD ^02 MOS02 0553 C770 MOS02 0603 C7AD ^02 MOS02 0554 C770 ;& fall through to ... MOS02 0603 C7AD ^02 MOS02 0555 C770 MOS02 0603 C7AD ^02 MOS02 0556 C770 MOS02 0603 C7AD ^02 MOS02 0557 C770 ;CRAN Anomalous carriage return MOS02 0603 C7AD ^02 MOS02 0558 C770 MOS02 0603 C7AD ^02 MOS02 0559 C770 A2 00 CRAN LDXIM GWLCOL-V ;Copy GWLCOL to GCSIX MOS02 0603 C7AD ^02 MOS02 0560 C772 A0 24 LDYIM GCSIX-V MOS02 0603 C7AD ^02 MOS02 0561 C774 20 39 D4 JSR COPY2 MOS02 0603 C7AD ^02 MOS02 0562 C777 4C 7D CA JMP IEG MOS02 0603 C7AD ^02 MOS02 0563 C77A MOS02 0603 C7AD ^02 MOS02 0564 C77A RPALET MOS02 0603 C7AD ^02 MOS02 0565 C77A 2D 60 03 AND NCOLOR ;Read parrot MOS02 0603 C7AD ^02 MOS02 0566 C77D AA TAX MOS02 0603 C7AD ^02 MOS02 0567 C77E BD 6F 03 LDAAX PARROT MOS02 0603 C7AD ^02 MOS02 0568 C781 C8 PRACA INY MOS02 0603 C7AD ^02 MOS02 0569 C782 91 F0 PRACB STAIY WARGS MOS02 0603 C7AD ^02 MOS02 0570 C784 A9 00 LDAIM &00 MOS02 0603 C7AD ^02 MOS02 0571 C786 C0 04 CPYIM &04 MOS02 0603 C7AD ^02 MOS02 0572 C788 D0 F7 BNE PRACA MOS02 0603 C7AD ^02 MOS02 0573 C78A 60 PRACX RTS MOS02 0603 C7AD ^02 MOS02 0574 C78B ] MOS02 0603 C7AD ^02 MOS02 0575 C78B MOS02 0603 C7AD ^02 MOS02 0576 C78B 8D 23 03 RSA STA QEND MOS02 0603 C7AD ^02 MOS02 0577 C78E 8D 22 03 STA QEND-&01 MOS02 0603 C7AD ^02 MOS02 0578 C791 MOS02 0603 C7AD ^02 MOS02 0579 C791 ;& fall through to .... MOS02 0603 C7AD ^02 MOS02 0580 C791 MOS02 0603 C7AD ^02 MOS02 0581 C791 ;US ($1F) Move text csr to x,y MOS02 0603 C7AD ^02 MOS02 0582 C791 MOS02 0603 C7AD ^02 MOS02 0583 C791 ;Put cursor to (x,y), where MOS02 0603 C7AD ^02 MOS02 0584 C791 ;x in QEND-1 & y in QEND MOS02 0603 C7AD ^02 MOS02 0585 C791 ;If illegal, leave cursor alone MOS02 0603 C7AD ^02 MOS02 0586 C791 MOS02 0603 C7AD ^02 MOS02 0587 C791 20 87 C5 US JSR ANOMQ ;Cursors joined ? MOS02 0603 C7AD ^02 MOS02 0588 C794 D0 F4 BNE PRACX ;Yes, then skip MOS02 0603 C7AD ^02 MOS02 0589 C796 20 AF C7 JSR USAF ;Remember current cursor MOS02 0603 C7AD ^02 MOS02 0590 C799 18 CLC MOS02 0603 C7AD ^02 MOS02 0591 C79A AD 22 03 LDA QEND-&01 ;Add offset to x posn MOS02 0603 C7AD ^02 MOS02 0592 C79D 6D 08 03 ADC TWLCOL MOS02 0603 C7AD ^02 MOS02 0593 C7A0 8D 18 03 STA CSX MOS02 0603 C7AD ^02 MOS02 0594 C7A3 AD 23 03 LDA QEND ;Add offset to y posn MOS02 0603 C7AD ^02 MOS02 0595 C7A6 18 CLC MOS02 0603 C7AD ^02 MOS02 0596 C7A7 6D 0B 03 ADC TWTROW MOS02 0603 C7AD ^02 MOS02 0597 C7AA [ MOS125 = &FF MOS02 0603 C7AD ^02 MOS02 0600 C7AA | MOS02 0603 C7AD ^02 MOS02 0601 C7AA 20 E8 CE JSR SYTADD ;Attempt to posn. csr MOS02 0603 C7AD ^02 MOS02 0602 C7AD ] MOS02 0603 C7AD ^02 MOS02 0603 C7AD 90 82 BCC FSD ;to a JMP CSDSP MOS02 0521 C74A v07 MOS02 0604 C7AF MOS02 0521 C74A v07 MOS02 0605 C7AF A2 18 USAF LDXIM CSX-V MOS02 0521 C74A v07 MOS02 0606 C7B1 A0 28 LDYIM USWS-V MOS02 0521 C74A v07 MOS02 0607 C7B3 4C CC CD JMP SWAP2 MOS02 0521 C74A v07 MOS02 0608 C7B6 MOS02 0521 C74A v07 MOS02 0609 C7B6 [ MOS125 = &FF MOS02 0521 C74A v07 MOS02 0610 C7B6 | MOS02 0521 C74A v07 MOS02 0611 C7B6 FFC MOS02 0521 C74A v07 MOS02 0612 C7B6 4C 9D CB JMP CLATXT ;Clear?, then fast clear MOS02 0521 C74A v07 MOS02 0613 C7B9 ] MOS02 0521 C74A v07 MOS02 0614 C7B9 MOS02 0521 C74A v07 MOS02 0615 C7B9 ;CR ($0D) Carriage return MOS02 0521 C74A v07 MOS02 0616 C7B9 MOS02 0521 C74A v07 MOS02 0617 C7B9 20 87 C5 CR JSR ANOMQ MOS02 0521 C74A v07 MOS02 0618 C7BC [ MOS125 = &FF MOS02 0521 C74A v07 MOS02 0621 C7BC | MOS02 0521 C74A v07 MOS02 0622 C7BC D0 B2 BNE CRAN MOS02 0521 C74A v07 MOS02 0623 C7BE ] MOS02 0521 C74A v07 MOS02 0624 C7BE 20 6E CE CRA JSR SSCRIM ;Position cursor to LH edge of window MOS02 0521 C74A v07 MOS02 0625 C7C1 4C AE C6 JMP CSDA ;Display cursor & TADDR MOS02 0521 C74A v07 MOS02 0626 C7C4 MOS02 0521 C74A v07 MOS02 0627 C7C4 LNK MOS03 MOS02 0521 C74A v07 MOS03 0001 C7C4 MOS02 0521 C74A v07 MOS03 0002 C7C4 TTL VDU File - MOS03 MOS02 0521 C74A v07 MOS03 0003 C7C4 OPT MOS03 MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 15 MOS03 VDU File - MOS03 MOS03 MOS02 0521 C74A v07 MOS03 0004 C7C4 MOS02 0521 C74A v07 MOS03 0005 C7C4 ;Last revision 15/06/82 MOS02 0521 C74A v07 MOS03 0006 C7C4 MOS02 0521 C74A v07 MOS03 0007 C7C4 ;15/06/82 Route ALL unknown plot commands thru VDUVEC, even in text modes MOS02 0521 C74A v07 MOS03 0008 C7C4 ;02/06/82 ETB mod to redef of ASCII MOS02 0521 C74A v07 MOS03 0009 C7C4 ;27/05/82 DCC (programme palette) recoded MOS02 0521 C74A v07 MOS03 0010 C7C4 ;05/05/82 Delete anomalous TAB MOS02 0521 C74A v07 MOS03 0011 C7C4 ; Move NAK to MOS02 MOS02 0521 C74A v07 MOS03 0012 C7C4 ;01/05/82 Recoded to allow for forward queueing & change in variable order MOS02 0521 C74A v07 MOS03 0013 C7C4 ;24/04/82 ETB Function 1 (hide/display cursor) coded MOS02 0521 C74A v07 MOS03 0014 C7C4 ;19/04/82 DCC & DCCB moved for byte saving MOS02 0521 C74A v07 MOS03 0015 C7C4 ;15/04/82 NPCOL used to fix VDU 19,0,20,0,0,0 bug MOS02 0521 C74A v07 MOS03 0016 C7C4 ;24/03/82 DLE leaves graphics cursor alone MOS02 0521 C74A v07 MOS03 0017 C7C4 ; ETB to check if font exploded before reprogramming fonts 1-3 MOS02 0521 C74A v07 MOS03 0018 C7C4 ;21/03/82 DLE to account for non-zero origins MOS02 0521 C74A v07 MOS03 0019 C7C4 ;22/01/82 EIG to EIGABS in graphics window definition MOS02 0521 C74A v07 MOS03 0020 C7C4 ;07/01/82 Catch illegal VDU 23,n,.... commands MOS02 0521 C74A v07 MOS03 0021 C7C4 ;15/11/81 Vertical sync user adjustment (Paul) MOS02 0521 C74A v07 MOS03 0022 C7C4 MOS02 0521 C74A v07 MOS03 0023 C7C4 ;INDIVIDUAL ROUTINES MOS02 0521 C74A v07 MOS03 0024 C7C4 MOS02 0521 C74A v07 MOS03 0025 C7C4 MOS02 0521 C74A v07 MOS03 0026 C7C4 ;DLE ($10) Clear graphics area MOS02 0521 C74A v07 MOS03 0027 C7C4 MOS02 0521 C74A v07 MOS03 0028 C7C4 20 69 C7 FFANOM JSR RSAN -- MOS03 0029 C7C7 AD 61 03 DLE LDA NPIX ;Non-graphics ? -- MOS03 0030 C7CA F0 33 BEQ DLEX MOS03 0030 C7CA v4C MOS03 0031 C7CC AE 5A 03 LDX BGCOLF ;Clear to the background colour MOS03 0030 C7CA v4C MOS03 0032 C7CF AC 5C 03 LDY GPLBMD ;Use the background colour mode MOS03 0030 C7CA v4C MOS03 0033 C7D2 20 C5 D0 JSR SETZG ;Set this up MOS03 0030 C7CA v4C MOS03 0034 C7D5 A2 00 LDXIM GWLCOL-V ;Copy window params from GWTROW ... MOS03 0030 C7CA v4C MOS03 0035 C7D7 A0 28 LDYIM DLEWS-V ;Copy window parameters to DLEWS MOS03 0030 C7CA v4C MOS03 0036 C7D9 20 33 D4 JSR COPY8 MOS03 0030 C7CA v4C MOS03 0037 C7DC 38 SEC ;How many lines to do ? MOS03 0030 C7CA v4C MOS03 0038 C7DD AD 06 03 LDA GWTROW MOS03 0030 C7CA v4C MOS03 0039 C7E0 ED 02 03 SBC GWBROW MOS03 0030 C7CA v4C MOS03 0040 C7E3 A8 TAY MOS03 0030 C7CA v4C MOS03 0041 C7E4 C8 INY ;Increment this to distinguish between 0 & 255 MOS03 0030 C7CA v4C MOS03 0042 C7E5 8C 30 03 STY DLENLN ;Line counter MOS03 0030 C7CA v4C MOS03 0043 C7E8 A2 2C DLEA LDXIM DLEWS+&04-V ;Point to R.H. point, containing valid Y address MOS03 0030 C7CA v4C MOS03 0044 C7EA A0 28 LDYIM DLEWS-V ;Point to L.H. point, with irrelevant Y address MOS03 0030 C7CA v4C MOS03 0045 C7EC 20 43 D6 JSR HPLOTA ;Clear the current line MOS03 0030 C7CA v4C MOS03 0046 C7EF AD 2E 03 LDA DLEWS+&06 ;Decrement the current line number MOS03 0030 C7CA v4C MOS03 0047 C7F2 D0 03 BNE DLEB MOS03 0030 C7CA v4C MOS03 0048 C7F4 CE 2F 03 DEC DLEWS+&07 MOS03 0030 C7CA v4C MOS03 0049 C7F7 CE 2E 03 DLEB DEC DLEWS+&06 MOS03 0030 C7CA v4C MOS03 0050 C7FA CE 30 03 DEC DLENLN MOS03 0030 C7CA v4C MOS03 0051 C7FD D0 E9 BNE DLEA MOS03 0030 C7CA v4C MOS03 0052 C7FF 60 DLEX RTS -- MOS03 0053 C800 -- MOS03 0054 C800 ;DC1 ($11) Programme foreground -- MOS03 0055 C800 ;or background colours for text -- MOS03 0056 C800 -- MOS03 0057 C800 A0 00 DCA LDYIM &00 ;Used for storing -- MOS03 0058 C802 F0 02 BEQ DCABA ;(branch always taken) MOS03 0058 C802 v7D MOS03 0059 C804 MOS03 0058 C802 v7D MOS03 0060 C804 ;DC2 ($12) Programme foreground MOS03 0058 C802 v7D MOS03 0061 C804 ;or background colours for graphics MOS03 0058 C802 v7D MOS03 0062 C804 ;QEND-1=mode MOS03 0058 C802 v7D MOS03 0063 C804 ;QEND =logical colour MOS03 0058 C802 v7D MOS03 0064 C804 MOS03 0058 C802 v7D MOS03 0065 C804 A0 02 DCB LDYIM &02 MOS03 0058 C802 v7D MOS03 0066 C806 AD 23 03 DCABA LDA QEND ;Get logical colour -- MOS03 0067 C809 10 01 BPL DCABB ;Foreground ? MOS03 0067 C809 v7E MOS03 0068 C80B C8 INY ;No, then point to background locations MOS03 0067 C809 v7E MOS03 0069 C80C 2D 60 03 DCABB AND NCOLOR -- MOS03 0070 C80F 85 DA STA ZTEMP -- MOS03 0071 C811 AD 60 03 LDA NCOLOR ;Sneaky offset method -- MOS03 0072 C814 F0 1B BEQ DCABX ;Branch for TTX MOS03 0072 C814 v64 MOS03 0073 C816 29 07 ANDIM &07 ;to FCOLTB. A=table base MOS03 0072 C814 v64 MOS03 0074 C818 18 CLC MOS03 0072 C814 v64 MOS03 0075 C819 65 DA ADC ZTEMP ;(A) = offset +1 MOS03 0072 C814 v64 MOS03 0076 C81B AA TAX MOS03 0072 C814 v64 MOS03 0077 C81C BD 23 C4 LDAAX FCOLTB -&01 MOS03 0072 C814 v64 MOS03 0078 C81F 99 57 03 STAAY FTCOLF ;(Y) set above to 0..3 MOS03 0072 C814 v64 MOS03 0079 C822 [ MOS125 = &FF MOS03 0072 C814 v64 MOS03 0084 C822 | MOS03 0072 C814 v64 MOS03 0085 C822 98 TYA MOS03 0072 C814 v64 MOS03 0086 C823 4A LSRA ;Graphics? MOS03 0072 C814 v64 MOS03 0087 C824 D0 0C BNE DCBAC ;Yes, then set up GPLMDE MOS03 0072 C814 v64 MOS03 0088 C826 18 CLC ;A=0, C=0; SBC takes one's complement MOS03 0072 C814 v64 MOS03 0089 C827 ED 57 03 SBC FTCOLF ;No, then set ZORA and ZEOR MOS03 0072 C814 v64 MOS03 0090 C82A ] MOS03 0072 C814 v64 MOS03 0091 C82A 85 D3 STA ZEOR ;ZEOR = NOT foreground MOS03 0072 C814 v64 MOS03 0092 C82C 4D 58 03 EOR BTCOLF ;ZORA = ZEOR EOR back MOS03 0072 C814 v64 MOS03 0093 C82F 85 D2 STA ZORA MOS03 0072 C814 v64 MOS03 0094 C831 60 DCABX RTS MOS03 0087 C824 v73 MOS03 0095 C832 AD 22 03 DCBAC LDA QEND-&01 -- MOS03 0096 C835 99 59 03 STAAY GPLFMD -&02 ;Y=2 or 3 (for fore or background) mode -- MOS03 0097 C838 60 RTS -- MOS03 0098 C839 -- MOS03 0099 C839 A9 20 DCTTX LDAIM TTXBCL ;TTX load with a particular byte ($20) MOS03 0122 C84D ^6A MOS03 0100 C83B 8D 58 03 STA BTCOLF ;Used only for screen clears MOS03 0122 C84D ^6A MOS03 0101 C83E 60 RTS MOS03 0122 C84D ^6A MOS03 0102 C83F MOS03 0122 C84D ^6A MOS03 0103 C83F ;DC3 ($13) is below this routine MOS03 0122 C84D ^6A MOS03 0104 C83F MOS03 0122 C84D ^6A MOS03 0105 C83F MOS03 0122 C84D ^6A MOS03 0106 C83F ;DC4 ($14) Set default physical MOS03 0122 C84D ^6A MOS03 0107 C83F ;- logical relations MOS03 0122 C84D ^6A MOS03 0108 C83F ;Default back & foreground clrs MOS03 0122 C84D ^6A MOS03 0109 C83F MOS03 0122 C84D ^6A MOS03 0110 C83F A2 05 DCD LDXIM &05 ;Programme all full colours & modes to zero MOS03 0122 C84D ^6A MOS03 0111 C841 A9 00 LDAIM &00 MOS03 0122 C84D ^6A MOS03 0112 C843 9D 57 03 DCDA STAAX FTCOLF MOS03 0122 C84D ^6A MOS03 0113 C846 CA DEX MOS03 0122 C84D ^6A MOS03 0114 C847 10 FA BPL DCDA MOS03 0122 C84D ^6A MOS03 0115 C849 [ MOS125 = &FF MOS03 0122 C84D ^6A MOS03 0119 C849 | MOS03 0122 C84D ^6A MOS03 0120 C849 8A TXA ;A = &FF MOS03 0122 C84D ^6A MOS03 0121 C84A AE 60 03 LDX NCOLOR ;Set foreground colours & ZORA & ZEOR MOS03 0122 C84D ^6A MOS03 0122 C84D F0 EA BEQ DCTTX ;Branch for TTX -- MOS03 0123 C84F ] -- MOS03 0124 C84F E0 0F CPXIM &0F -- MOS03 0125 C851 D0 02 BNE DCDB MOS03 0125 C851 v7D MOS03 0126 C853 A9 3F LDAIM INVSXT ;Don't invert flashing bit MOS03 0125 C851 v7D MOS03 0127 C855 8D 57 03 DCDB STA FTCOLF -- MOS03 0128 C858 8D 59 03 STA FGCOLF -- MOS03 0129 C85B 49 FF EORIM &FF -- MOS03 0130 C85D 85 D2 STA ZORA -- MOS03 0131 C85F 85 D3 STA ZEOR MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 16 MOS03 VDU File - MOS03 MOS03 -- MOS03 0132 C861 8E 1F 03 STX QEND-&04 ;set logical colour := NCOLOR -- MOS03 0133 C864 [ MOS125 = &FF -- MOS03 0166 C864 | -- MOS03 0167 C864 A9 07 LDAIM &07 -- MOS03 0168 C866 E0 03 CPXIM &03 ;How many colours? -- MOS03 0169 C868 90 0A BCC DCDLF MOS03 0169 C868 v75 MOS03 0170 C86A D0 0E BNE DCDLI MOS03 0170 C86A v71 MOS03 0171 C86C MOS03 0170 C86A v71 MOS03 0172 C86C ;4 colour, use shift right of $07 MOS03 0170 C86A v71 MOS03 0173 C86C MOS03 0170 C86A v71 MOS03 0174 C86C 20 7F C8 JSR DCDLJ ;Programme log.=3, phys.=7 MOS03 0170 C86A v71 MOS03 0175 C86F CE 1F 03 DEC QEND-&04 ;Programme log.=2, phys.=3 MOS03 0170 C86A v71 MOS03 0176 C872 A9 03 LDAIM &03 ;then 1=1, 0=0 MOS03 0170 C86A v71 MOS03 0177 C874 MOS03 0170 C86A v71 MOS03 0178 C874 ;2 colour (TTX also executes this rouine) MOS03 0170 C86A v71 MOS03 0179 C874 MOS03 0170 C86A v71 MOS03 0180 C874 20 7F C8 DCDLF JSR DCDLJ ;Programme log.=1, phys.=7 MOS03 0170 C86A v71 MOS03 0181 C877 CE 1F 03 DEC QEND-&04 MOS03 0170 C86A v71 MOS03 0182 C87A MOS03 0170 C86A v71 MOS03 0183 C87A ;16 colours - one to one MOS03 0170 C86A v71 MOS03 0184 C87A MOS03 0170 C86A v71 MOS03 0185 C87A DCDLI MOS03 0170 C86A v71 MOS03 0186 C87A MOS03 0170 C86A v71 MOS03 0187 C87A AD 1F 03 LDA QEND-&04 MOS03 0188 C87D ^75 MOS03 0188 C87D D0 F5 BNE DCDLF -- MOS03 0189 C87F 8D 20 03 DCDLJ STA QEND-&03 ;& fall through to .... -- MOS03 0190 C882 ] -- MOS03 0191 C882 -- MOS03 0192 C882 ;DC3 ($13) - Programme logical/ -- MOS03 0193 C882 ;physical colour relation -- MOS03 0194 C882 -- MOS03 0195 C882 ;Logical colour in QEND-4 -- MOS03 0196 C882 ;Physical colour in QEND-3 -- MOS03 0197 C882 -- MOS03 0198 C882 08 DCC PHP -- MOS03 0199 C883 78 SEI -- MOS03 0200 C884 AD 1F 03 LDA QEND-&04 ;Determine logical colour -- MOS03 0201 C887 2D 60 03 AND NCOLOR -- MOS03 0202 C88A AA TAX -- MOS03 0203 C88B AD 20 03 LDA QEND-&03 ;Get physical colour -- MOS03 0204 C88E 29 0F DCC1 ANDIM NPCOL ;mask off confusing bits MOS03 0293 C8CE ^3E MOS03 0205 C890 9D 6F 03 STAAX PARROT ;Write to list MOS03 0293 C8CE ^3E MOS03 0206 C893 [ MOS125 = &FF MOS03 0293 C8CE ^3E MOS03 0223 C893 | MOS03 0293 C8CE ^3E MOS03 0224 C893 86 FA STX SEIWKA MOS03 0293 C8CE ^3E MOS03 0225 C895 AD 60 03 LDA NCOLOR MOS03 0293 C8CE ^3E MOS03 0226 C898 C9 03 CMPIM &03 MOS03 0293 C8CE ^3E MOS03 0227 C89A 08 PHP ;Needed later MOS03 0293 C8CE ^3E MOS03 0228 C89B 4A LSRA MOS03 0293 C8CE ^3E MOS03 0229 C89C 46 FA DCCALA LSR SEIWKA ;determine start position =Logi*16/(ncolor+1)*16 MOS03 0293 C8CE ^3E MOS03 0230 C89E 6A RORA MOS03 0293 C8CE ^3E MOS03 0231 C89F B0 FB BCS DCCALA MOS03 0293 C8CE ^3E MOS03 0232 C8A1 1D 6F 03 ORAAX PARROT ;Get physical colour MOS03 0293 C8CE ^3E MOS03 0233 C8A4 A0 F0 LDYIM &F0 ;Initialise loop counter MOS03 0293 C8CE ^3E MOS03 0234 C8A6 MOS03 0293 C8CE ^3E MOS03 0235 C8A6 AA DCCALB TAX ;Byte to be given to VPROC1 MOS03 0293 C8CE ^3E MOS03 0236 C8A7 28 PLP ;Does NCOLOR=3? MOS03 0293 C8CE ^3E MOS03 0237 C8A8 ] MOS03 0293 C8CE ^3E MOS03 0238 C8A8 08 PHP MOS03 0293 C8CE ^3E MOS03 0239 C8A9 D0 09 BNE DCCALC ;No?, then skip MOS03 0293 C8CE ^3E MOS03 0240 C8AB [ MOS125 = &FF MOS03 0293 C8CE ^3E MOS03 0249 C8AB | MOS03 0293 C8CE ^3E MOS03 0250 C8AB 0A ASLA ;b6,b5 to b7,b6; clear b0 MOS03 0293 C8CE ^3E MOS03 0251 C8AC 69 40 ADCIM &40 ;carry doesn't matter (thanks Woz) MOS03 0293 C8CE ^3E MOS03 0252 C8AE 0A ASLA ;b6 EOR b5 to C MOS03 0293 C8CE ^3E MOS03 0253 C8AF 8A TXA ;restore byte MOS03 0293 C8CE ^3E MOS03 0254 C8B0 90 02 BCC DCCALC ;If b5 & b6 both set or clear, don't invert them MOS03 0293 C8CE ^3E MOS03 0255 C8B2 49 60 EORIM &60 MOS03 0293 C8CE ^3E MOS03 0256 C8B4 ] MOS03 0293 C8CE ^3E MOS03 0257 C8B4 20 16 EA DCCALC JSR MVPRC1 ;Save (X) & (Y) MOS03 0293 C8CE ^3E MOS03 0258 C8B7 98 TYA ;Loop counter MOS03 0293 C8CE ^3E MOS03 0259 C8B8 [ MOS125 = &FF MOS03 0293 C8CE ^3E MOS03 0268 C8B8 | MOS03 0293 C8CE ^3E MOS03 0269 C8B8 18 CLC MOS03 0293 C8CE ^3E MOS03 0270 C8B9 6D 60 03 ADC NCOLOR MOS03 0293 C8CE ^3E MOS03 0271 C8BC A8 TAY MOS03 0293 C8CE ^3E MOS03 0272 C8BD 8A TXA ;Restore (A) MOS03 0293 C8CE ^3E MOS03 0273 C8BE 69 10 ADCIM &10 ;c=0 MOS03 0293 C8CE ^3E MOS03 0274 C8C0 C8 INY MOS03 0293 C8CE ^3E MOS03 0275 C8C1 30 E3 BMI DCCALB MOS03 0293 C8CE ^3E MOS03 0276 C8C3 ] MOS03 0293 C8CE ^3E MOS03 0277 C8C3 28 PLP MOS03 0293 C8CE ^3E MOS03 0278 C8C4 28 PLP MOS03 0293 C8CE ^3E MOS03 0279 C8C5 60 RTS MOS03 0293 C8CE ^3E MOS03 0280 C8C6 MOS03 0293 C8CE ^3E MOS03 0281 C8C6 MOS03 0293 C8CE ^3E MOS03 0282 C8C6 ;OSWORD call to programme palette MOS03 0293 C8CE ^3E MOS03 0283 C8C6 MOS03 0293 C8CE ^3E MOS03 0284 C8C6 PRPAL MOS03 0293 C8CE ^3E MOS03 0285 C8C6 08 PHP MOS03 0293 C8CE ^3E MOS03 0286 C8C7 2D 60 03 AND NCOLOR ;Get logical colour MOS03 0293 C8CE ^3E MOS03 0287 C8CA AA TAX MOS03 0293 C8CE ^3E MOS03 0288 C8CB C8 INY ;(Y):=1 MOS03 0293 C8CE ^3E MOS03 0289 C8CC B1 F0 LDAIY WARGS ;Load physical colour MOS03 0293 C8CE ^3E MOS03 0290 C8CE [ MOS125 = &FF MOS03 0293 C8CE ^3E MOS03 0292 C8CE | MOS03 0293 C8CE ^3E MOS03 0293 C8CE 90 BE BCC DCC1 ;C=0 from WORD->BYTE2 -- MOS03 0294 C8D0 ] -- MOS03 0295 C8D0 -- MOS03 0296 C8D0 ;SYN ($16) Change mode -- MOS03 0297 C8D0 -- MOS03 0298 C8D0 AD 23 03 SYN LDA QEND ;Get the mode -- MOS03 0299 C8D3 4C 10 CB JMP CHMODE -- MOS03 0300 C8D6 -- MOS03 0301 C8D6 ;ETB ($17) Programme soft font -- MOS03 0302 C8D6 ;Programme character font to user definition -- MOS03 0303 C8D6 ;Character to be programmed in Q+08, top row in Q+07 -- MOS03 0304 C8D6 ;through to bottom row in Q+00 -- MOS03 0305 C8D6 -- MOS03 0306 C8D6 AD 1B 03 ETB LDA QEND-&08 ;Is it the soft font ? -- MOS03 0307 C8D9 C9 20 CMPIM &20 ;Is it a printable character ? -- MOS03 0308 C8DB 90 38 BCC ETBD MOS03 0308 C8DB v47 MOS03 0309 C8DD [ MOS125 = &FF MOS03 0308 C8DB v47 MOS03 0347 C8DD | MOS03 0308 C8DB v47 MOS03 0348 C8DD 20 50 D0 JSR CHADDR MOS03 0308 C8DB v47 MOS03 0349 C8E0 ;returns X=font no., Y=(ZTEMPC+&01)=hard/soft page no. MOS03 0308 C8DB v47 MOS03 0350 C8E0 ;A=font flag mask, (ZTEMPC)=hard/soft character address MOS03 0308 C8DB v47 MOS03 0351 C8E0 2C 67 03 BIT FNTFLG ;flag set ? MOS03 0308 C8DB v47 MOS03 0352 C8E3 D0 1E BNE ETBB ;Yes?, then just copy defn. MOS03 0308 C8DB v47 MOS03 0353 C8E5 0D 67 03 ORA FNTFLG MOS03 0308 C8DB v47 MOS03 0354 C8E8 8D 67 03 STA FNTFLG MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 17 MOS03 VDU File - MOS03 MOS03 MOS03 0308 C8DB v47 MOS03 0355 C8EB 84 DD STY ZTEMPB +&01 ;point to hard font MOS03 0308 C8DB v47 MOS03 0356 C8ED BC 67 03 LDYAX PGSFNT -&01 ;point to soft font MOS03 0308 C8DB v47 MOS03 0357 C8F0 84 DF STY ZTEMPC +&01 MOS03 0308 C8DB v47 MOS03 0358 C8F2 A6 DE LDX ZTEMPC +&00 ;save character offset MOS03 0308 C8DB v47 MOS03 0359 C8F4 A0 00 LDYIM &00 MOS03 0308 C8DB v47 MOS03 0360 C8F6 84 DC STY ZTEMPB +&00 ;align both pointers MOS03 0308 C8DB v47 MOS03 0361 C8F8 84 DE STY ZTEMPC +&00 MOS03 0308 C8DB v47 MOS03 0362 C8FA B1 DC ETBC LDAIY ZTEMPB ;copy from hard font MOS03 0308 C8DB v47 MOS03 0363 C8FC 91 DE STAIY ZTEMPC ;to soft font MOS03 0308 C8DB v47 MOS03 0364 C8FE 88 DEY MOS03 0308 C8DB v47 MOS03 0365 C8FF D0 F9 BNE ETBC MOS03 0308 C8DB v47 MOS03 0366 C901 86 DE STX ZTEMPC +&00 ;restore character offset MOS03 0308 C8DB v47 MOS03 0367 C903 ETBB MOS03 0308 C8DB v47 MOS03 0368 C903 A0 07 LDYIM &07 ;& copy character into the font MOS03 0308 C8DB v47 MOS03 0369 C905 B9 1C 03 ETBA LDAAY QEND-&07 MOS03 0308 C8DB v47 MOS03 0370 C908 91 DE STAIY ZTEMPC MOS03 0308 C8DB v47 MOS03 0371 C90A 88 DEY MOS03 0308 C8DB v47 MOS03 0372 C90B 10 F8 BPL ETBA MOS03 0308 C8DB v47 MOS03 0373 C90D ] MOS03 0308 C8DB v47 MOS03 0374 C90D 60 ETCX RTS MOS03 0308 C8DB v47 MOS03 0375 C90E MOS03 0308 C8DB v47 MOS03 0376 C90E JMIV25 MOS03 0308 C8DB v47 MOS03 0377 C90E AD 1F 03 LDA PLMODE MOS03 0434 C965 ^27 MOS03 0378 C911 18 CLC MOS03 0434 C965 ^27 MOS03 0379 C912 ; C=0 MOS03 0434 C965 ^27 MOS03 0380 C912 JMIV23 ;C=1 MOS03 0434 C965 ^27 MOS03 0381 C912 6C 26 02 JMI VDUVEC MOS03 0434 C965 ^27 MOS03 0382 C915 ; MOS03 0434 C965 ^27 MOS03 0383 C915 C9 01 ETBD CMPIM &01 ;Valid command ? MOS03 0434 C965 ^27 MOS03 0384 C917 90 15 BCC ETD MOS03 0434 C965 ^27 MOS03 0385 C919 ; C=1 MOS03 0434 C965 ^27 MOS03 0386 C919 D0 F7 BNE JMIV23 ;No?, then jump indirect to user vector with C=1 MOS03 0434 C965 ^27 MOS03 0387 C91B ; MOS03 0434 C965 ^27 MOS03 0388 C91B 20 87 C5 JSR ANOMQ ;Anom. printing? ~~~ FUNCTION 1 Turn cursor on/off ~~~ MOS03 0434 C965 ^27 MOS03 0389 C91E D0 ED BNE ETCX ;Yes?, then don't do it MOS03 0434 C965 ^27 MOS03 0390 C920 A9 20 LDAIM &20 MOS03 0434 C965 ^27 MOS03 0391 C922 AC 1C 03 LDY QEND-&07 ;Hide(0) or display(1)? MOS03 0434 C965 ^27 MOS03 0392 C925 F0 03 BEQ ETCB MOS03 0434 C965 ^27 MOS03 0393 C927 AD 5F 03 ETCA LDA CSTEMP ;RESTORE CURSOR MOS03 0434 C965 ^27 MOS03 0394 C92A A0 0A ETCB LDYIM &0A MOS03 0434 C965 ^27 MOS03 0395 C92C D0 2D BNE CRTCPA ;Programme the 6845 without saving to CSTEMP MOS03 0434 C965 ^27 MOS03 0396 C92E MOS03 0434 C965 ^27 MOS03 0397 C92E AD 1D 03 ETD LDA QEND-&06 ;~~~ FUNCTION 0 Programme 6845 register #(Q+7) WITH (Q+6) ~~~ MOS03 0434 C965 ^27 MOS03 0398 C931 AC 1C 03 LDY QEND-&07 MOS03 0434 C965 ^27 MOS03 0399 C934 MOS03 0434 C965 ^27 MOS03 0400 C934 C0 07 CRTCP CPYIM &07 MOS03 0434 C965 ^27 MOS03 0401 C936 90 23 BCC CRTCPA ;[register<7, so not register 7 or 10] MOS03 0434 C965 ^27 MOS03 0402 C938 D0 03 BNE CRTCPC ;[not vertical sync position] MOS03 0434 C965 ^27 MOS03 0403 C93A MOS03 0434 C965 ^27 MOS03 0404 C93A 6D 90 02 ADC VERTIC ;apply user adjustment (c=1) MOS03 0434 C965 ^27 MOS03 0405 C93D MOS03 0434 C965 ^27 MOS03 0406 C93D C0 08 CRTCPC CPYIM &08 MOS03 0434 C965 ^27 MOS03 0407 C93F D0 07 BNE CRTCPD ;[not interlace mode register] MOS03 0434 C965 ^27 MOS03 0408 C941 09 00 ORAIM &00 ; interlace mode register MOS03 0434 C965 ^27 MOS03 0409 C943 30 03 BMI CRTCPD ;[do not alter interlace (probably teletext)] MOS03 0434 C965 ^27 MOS03 0410 C945 ; MOS03 0434 C965 ^27 MOS03 0411 C945 4D 91 02 EOR INTERL ;modify interlace MOS03 0434 C965 ^27 MOS03 0412 C948 C0 0A CRTCPD CPYIM &0A ;Cursor start register ? MOS03 0434 C965 ^27 MOS03 0413 C94A D0 0F BNE CRTCPA ;[not cursor start register] MOS03 0434 C965 ^27 MOS03 0414 C94C 8D 5F 03 STA CSTEMP ;Yes?, then record this for separate cursors MOS03 0434 C965 ^27 MOS03 0415 C94F A8 TAY MOS03 0434 C965 ^27 MOS03 0416 C950 A5 D0 LDA STATS ;Are cursors joined ? MOS03 0434 C965 ^27 MOS03 0417 C952 29 20 ANDIM &20 MOS03 0434 C965 ^27 MOS03 0418 C954 08 PHP ;(very nasty coding, but it is short) MOS03 0434 C965 ^27 MOS03 0419 C955 98 TYA MOS03 0434 C965 ^27 MOS03 0420 C956 A0 0A LDYIM &0A MOS03 0434 C965 ^27 MOS03 0421 C958 28 PLP MOS03 0434 C965 ^27 MOS03 0422 C959 D0 06 BNE CRTCPB ;Yes, then don't write to 6845 MOS03 0434 C965 ^27 MOS03 0423 C95B 8C 00 FE CRTCPA STY CRTCA ;Address said register MOS03 0434 C965 ^27 MOS03 0424 C95E 8D 01 FE STA CRTCD ;and store data therein MOS03 0434 C965 ^27 MOS03 0425 C961 60 CRTCPB RTS ;(Referenced from EM) MOS03 0434 C965 ^27 MOS03 0426 C962 MOS03 0434 C965 ^27 MOS03 0427 C962 ;ESC ($1B) does bugger all MOS03 0434 C965 ^27 MOS03 0428 C962 MOS03 0434 C965 ^27 MOS03 0429 C962 ;Jump table points to the RTS at ACK MOS03 0434 C965 ^27 MOS03 0430 C962 MOS03 0434 C965 ^27 MOS03 0431 C962 ;EM ($19) - Plotting MOS03 0434 C965 ^27 MOS03 0432 C962 MOS03 0434 C965 ^27 MOS03 0433 C962 AE 61 03 EM LDX NPIX ;Filter out non-graphics modes MOS03 0434 C965 ^27 MOS03 0434 C965 F0 A7 BEQ JMIV25 ;[text mode] -- MOS03 0435 C967 4C 70 D0 JMP EMA ;Jump to graphics routines -- MOS03 0436 C96A -- MOS03 0437 C96A ;Hardware scroll down -- MOS03 0438 C96A ;Doesn't touch cursor -- MOS03 0439 C96A -- MOS03 0440 C96A ; These routines return z=0 -- MOS03 0441 C96A -- MOS03 0442 C96A AE 50 03 HSCRDN LDX TOPSCN ;Subt. BYTROW from TOPSCN -- MOS03 0443 C96D AD 51 03 LDA TOPSCN+&01 -- MOS03 0444 C970 20 DE CB JSR SUBROW -- MOS03 0445 C973 B0 14 BCS NEWTOP ;Wraparound? No?, then done MOS03 0445 C973 v6B MOS03 0446 C975 6D 54 03 ADC BYTSCN ;Yes?, then add screen length MOS03 0445 C973 v6B MOS03 0447 C978 90 0F BCC NEWTOP ;(branch always taken) MOS03 0445 C973 v6B MOS03 0448 C97A MOS03 0445 C973 v6B MOS03 0449 C97A AE 50 03 HSCRUP LDX TOPSCN ;Add BYTROW to TOPSCN MOS03 0445 C973 v6B MOS03 0450 C97D AD 51 03 LDA TOPSCN+&01 MOS03 0445 C973 v6B MOS03 0451 C980 20 B1 CA JSR ADDROW MOS03 0445 C973 v6B MOS03 0452 C983 10 04 BPL NEWTOP ;Wraparound? MOS03 0445 C973 v6B MOS03 0453 C985 38 SEC MOS03 0445 C973 v6B MOS03 0454 C986 ED 54 03 SBC BYTSCN ;Yes?, then subtract off screen length MOS03 0445 C973 v6B MOS03 0455 C989 8D 51 03 NEWTOP STA TOPSCN +&01 -- MOS03 0456 C98C 8E 50 03 STX TOPSCN -- MOS03 0457 C98F A0 0C LDYIM &0C ;Prog. START of 6845 -- MOS03 0458 C991 D0 51 BNE AXCRTA ;(branch always taken) MOS03 0458 C991 v2E MOS03 0459 C993 MOS03 0458 C991 v2E MOS03 0460 C993 ;SUB ($1A) - Sets default text MOS03 0458 C991 v2E MOS03 0461 C993 ;& graphics windows. MOS03 0458 C991 v2E MOS03 0462 C993 ;Homes both cursors MOS03 0458 C991 v2E MOS03 0463 C993 ;Sets graphics origin to (0,0) MOS03 0458 C991 v2E MOS03 0464 C993 MOS03 0458 C991 v2E MOS03 0465 C993 ;Clear all window parameters, MOS03 0458 C991 v2E MOS03 0466 C993 ;Both cusors, & gr. origin MOS03 0458 C991 v2E MOS03 0467 C993 MOS03 0458 C991 v2E MOS03 0468 C993 A9 00 SUB LDAIM &00 MOS03 0458 C991 v2E MOS03 0469 C995 A2 2C LDXIM VDUWS+&04-GWLCOL ;THIS VALUE LIKELY TO CHANGE ! MOS03 0458 C991 v2E MOS03 0470 C997 9D 00 03 SUBA STAAX GWLCOL MOS03 0458 C991 v2E MOS03 0471 C99A CA DEX MOS03 0458 C991 v2E MOS03 0472 C99B 10 FA BPL SUBA MOS03 0458 C991 v2E MOS03 0473 C99D MOS03 0458 C991 v2E MOS03 0474 C99D ;Set other parameters MOS03 0458 C991 v2E MOS03 0475 C99D MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 18 MOS03 VDU File - MOS03 MOS03 MOS03 0458 C991 v2E MOS03 0476 C99D AE 55 03 LDX MODE ;Get no. of char. cols. MOS03 0458 C991 v2E MOS03 0477 C9A0 BC EF C3 LDYAX PCOLS ;How many columns ? MOS03 0458 C991 v2E MOS03 0478 C9A3 8C 0A 03 STY TWRCOL ;Default text window MOS03 0458 C991 v2E MOS03 0479 C9A6 20 5C CA JSR SETPWW ;Set the text width MOS03 0458 C991 v2E MOS03 0480 C9A9 BC E7 C3 LDYAX PROWS ;Get no. char. rows MOS03 0458 C991 v2E MOS03 0481 C9AC 8C 09 03 STY TWBROW ;Default text window MOS03 0458 C991 v2E MOS03 0482 C9AF A0 03 LDYIM &03 ;GRAPHICS WINDOW Top row MOS03 0458 C991 v2E MOS03 0483 C9B1 8C 23 03 STY QEND MOS03 0458 C991 v2E MOS03 0484 C9B4 C8 INY MOS03 0458 C991 v2E MOS03 0485 C9B5 8C 21 03 STY QEND-&02 ;right column MOS03 0458 C991 v2E MOS03 0486 C9B8 CE 22 03 DEC QEND-&01 ;now = $FF MOS03 0458 C991 v2E MOS03 0487 C9BB CE 20 03 DEC QEND-&03 ;now = $FF MOS03 0458 C991 v2E MOS03 0488 C9BE 20 0D CA JSR CAN ;Transfer to window & convert co-ords MOS03 0458 C991 v2E MOS03 0489 C9C1 A9 F7 LDAIM &F7 ;Clear bit 3 of STATS (default windows set) MOS03 0458 C991 v2E MOS03 0490 C9C3 20 A7 C5 JSR STTAND MOS03 0458 C991 v2E MOS03 0491 C9C6 AE 50 03 LDX TOPSCN ;Programme cursor MOS03 0458 C991 v2E MOS03 0492 C9C9 AD 51 03 LDA TOPSCN+&01 ;to top L.H. byte MOS03 0458 C991 v2E MOS03 0493 C9CC 8E 4A 03 CSDSPA STX CSPOSN MOS03 0458 C991 v2E MOS03 0494 C9CF 8D 4B 03 STA CSPOSN +&01 MOS03 0458 C991 v2E MOS03 0495 C9D2 10 04 BPL CSDSP MOS03 0458 C991 v2E MOS03 0496 C9D4 38 SEC MOS03 0458 C991 v2E MOS03 0497 C9D5 ED 54 03 SBC BYTSCN MOS03 0458 C991 v2E MOS03 0498 C9D8 86 D8 CSDSP STX ZMEMT MOS03 0458 C991 v2E MOS03 0499 C9DA 85 D9 STA ZMEMT +&01 MOS03 0458 C991 v2E MOS03 0500 C9DC AE 4A 03 LDX CSPOSN MOS03 0458 C991 v2E MOS03 0501 C9DF AD 4B 03 LDA CSPOSN +&01 MOS03 0458 C991 v2E MOS03 0502 C9E2 A0 0E LDYIM &0E MOS03 0458 C991 v2E MOS03 0503 C9E4 48 AXCRTA PHA -- MOS03 0504 C9E5 AD 55 03 LDA MODE ;Is it teletext ? -- MOS03 0505 C9E8 C9 07 CMPIM &07 -- MOS03 0506 C9EA 68 PLA -- MOS03 0507 C9EB B0 10 BCS AXCRTB MOS03 0507 C9EB v6F MOS03 0508 C9ED 86 DA STX ZTEMP ;No?, then divide by 8 MOS03 0507 C9EB v6F MOS03 0509 C9EF 4A LSRA MOS03 0507 C9EB v6F MOS03 0510 C9F0 66 DA ROR ZTEMP MOS03 0507 C9EB v6F MOS03 0511 C9F2 4A LSRA MOS03 0507 C9EB v6F MOS03 0512 C9F3 66 DA ROR ZTEMP MOS03 0507 C9EB v6F MOS03 0513 C9F5 4A LSRA MOS03 0507 C9EB v6F MOS03 0514 C9F6 66 DA ROR ZTEMP MOS03 0507 C9EB v6F MOS03 0515 C9F8 A6 DA LDX ZTEMP MOS03 0507 C9EB v6F MOS03 0516 C9FA 4C FF C9 JMP AXCRTC MOS03 0507 C9EB v6F MOS03 0517 C9FD ;For TTX, fiddle the high address lines MOS03 0507 C9EB v6F MOS03 0518 C9FD [ MOS125 = &FF MOS03 0507 C9EB v6F MOS03 0521 C9FD | MOS03 0507 C9EB v6F MOS03 0522 C9FD ;on entry C=1, A=&7C..83, normal/wrapped screen address high byte, we need: MOS03 0507 C9EB v6F MOS03 0523 C9FD ;b5 = MA13 set, TTXVDU address mapping MOS03 0507 C9EB v6F MOS03 0524 C9FD ;b4 = MA12 clear, no HIRES wraparound MOS03 0507 C9EB v6F MOS03 0525 C9FD ;b3 = MA11 set, high RAM bank MOS03 0507 C9EB v6F MOS03 0526 C9FD ;b2 = MA10 indicates TTX wraparound, needed on-chip for cursor display MOS03 0507 C9EB v6F MOS03 0527 C9FD ;b7,6 unused MOS03 0507 C9EB v6F MOS03 0528 C9FD E9 54 AXCRTB SBCIM &54 ;map to &28..2F -- MOS03 0529 C9FF ] -- MOS03 0530 C9FF ;Write (A) to reg. (Y) of 6845 -- MOS03 0531 C9FF ;& (X) to reg. (Y)+1 -- MOS03 0532 C9FF -- MOS03 0533 C9FF 8C 00 FE AXCRTC STY CRTCA ;Access reg. (Y) -- MOS03 0534 CA02 8D 01 FE STA CRTCD ;Store MSB -- MOS03 0535 CA05 C8 INY ;Access reg. (Y)+1 -- MOS03 0536 CA06 8C 00 FE STY CRTCA -- MOS03 0537 CA09 8E 01 FE STX CRTCD ;Store LSB -- MOS03 0538 CA0C 60 RTS -- MOS03 0539 CA0D -- MOS03 0540 CA0D ;CAN ($18) Define graphics area -- MOS03 0541 CA0D -- MOS03 0542 CA0D ;QEND-7 = L.H. margin = GWLCOL Low byte 1st -- MOS03 0543 CA0D ;QEND-5 = Bottom row = GWBROW -- MOS03 0544 CA0D ;QEND-3 = R.H. margin = GWRCOL -- MOS03 0545 CA0D ;QEND-1 = Top row = GWTROW -- MOS03 0546 CA0D -- MOS03 0547 CA0D 20 55 CA CAN JSR CANB ;Swap graphics cursor with innocuous bytes in WS -- MOS03 0548 CA10 A2 1C LDXIM QEND-&07-V -- MOS03 0549 CA12 A0 2C LDYIM CDELTA-V -- MOS03 0550 CA14 20 C8 D3 JSR TRISA ;Calculate window differences to CDELTA -- MOS03 0551 CA17 0D 2D 03 ORA CDELTA+&01 ;(A) returns with CDELTA+3= DeltaY, so OR with DeltaX -- MOS03 0552 CA1A 30 39 BMI CANB ;If either is -ve, then illegal window MOS03 0552 CA1A v46 MOS03 0553 CA1C A2 20 LDXIM QEND-&03-V ;Convert window to Ico-ords MOS03 0552 CA1A v46 MOS03 0554 CA1E 20 5B D1 JSR EIGABS MOS03 0552 CA1A v46 MOS03 0555 CA21 A2 1C LDXIM QEND-&07-V MOS03 0552 CA1A v46 MOS03 0556 CA23 20 5B D1 JSR EIGABS MOS03 0552 CA1A v46 MOS03 0557 CA26 AD 1F 03 LDA QEND-&04 ;Are both lower margins +ve ? MOS03 0552 CA1A v46 MOS03 0558 CA29 0D 1D 03 ORA QEND-&06 MOS03 0552 CA1A v46 MOS03 0559 CA2C 30 27 BMI CANB ;No?, then illegal MOS03 0552 CA1A v46 MOS03 0560 CA2E AD 23 03 LDA QEND ;Is Y valid ? MOS03 0552 CA1A v46 MOS03 0561 CA31 D0 22 BNE CANB ;Only if MSB is zero MOS03 0552 CA1A v46 MOS03 0562 CA33 AE 55 03 LDX MODE ;Is X valid ? MOS03 0552 CA1A v46 MOS03 0563 CA36 AD 21 03 LDA QEND-&02 ;Divide by 8 & see if > no. of character cols MOS03 0552 CA1A v46 MOS03 0564 CA39 85 DA STA ZTEMP MOS03 0552 CA1A v46 MOS03 0565 CA3B AD 20 03 LDA QEND-&03 ;LSB of RH margin -1 MOS03 0552 CA1A v46 MOS03 0566 CA3E 46 DA LSR ZTEMP MOS03 0552 CA1A v46 MOS03 0567 CA40 6A RORA MOS03 0552 CA1A v46 MOS03 0568 CA41 46 DA LSR ZTEMP MOS03 0552 CA1A v46 MOS03 0569 CA43 D0 10 BNE CANB MOS03 0552 CA1A v46 MOS03 0570 CA45 6A RORA MOS03 0552 CA1A v46 MOS03 0571 CA46 4A LSRA MOS03 0552 CA1A v46 MOS03 0572 CA47 DD EF C3 CMPAX PCOLS MOS03 0552 CA1A v46 MOS03 0573 CA4A F0 02 BEQ CANA MOS03 0552 CA1A v46 MOS03 0574 CA4C 10 07 BPL CANB MOS03 0552 CA1A v46 MOS03 0575 CA4E A0 00 CANA LDYIM GWLCOL-V ;Copy to window MOS03 0552 CA1A v46 MOS03 0576 CA50 A2 1C LDXIM QEND-&07-V ;From Q MOS03 0552 CA1A v46 MOS03 0577 CA52 20 33 D4 JSR COPY8 MOS03 0552 CA1A v46 MOS03 0578 CA55 A2 10 CANB LDXIM GCSR-V ;Swap GCSR with CANWS, as EIGABS corrupts this -- MOS03 0579 CA57 A0 28 LDYIM CANWS-V -- MOS03 0580 CA59 4C D4 CD JMP SWAPF -- MOS03 0581 CA5C -- MOS03 0582 CA5C ;Set printer window width -- MOS03 0583 CA5C ;Char. width in A -- MOS03 0584 CA5C ;Mode in X -- MOS03 0585 CA5C -- MOS03 0586 CA5C C8 SETPWW INY -- MOS03 0587 CA5D 98 TYA -- MOS03 0588 CA5E A0 00 LDYIM &00 -- MOS03 0589 CA60 8C 4D 03 STY PWWDTH +&01 ;Clear MSB -- MOS03 0590 CA63 8D 4C 03 STA PWWDTH -- MOS03 0591 CA66 AD 4F 03 LDA BYTCH ;How many times to shift PWWDTH left ? -- MOS03 0592 CA69 4A LSRA -- MOS03 0593 CA6A F0 09 BEQ SETPWC ;TTX? MOS03 0593 CA6A v76 MOS03 0594 CA6C 0E 4C 03 SETPWA ASL PWWDTH MOS03 0593 CA6A v76 MOS03 0595 CA6F 2E 4D 03 ROL PWWDTH +&01 MOS03 0593 CA6A v76 MOS03 0596 CA72 4A LSRA MOS03 0593 CA6A v76 MOS03 0597 CA73 90 F7 BCC SETPWA MOS03 0593 CA6A v76 MOS03 0598 CA75 60 SETPWC RTS ;This used to be FSFAIL & ESCFL & ESCBB as well MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 19 MOS03 VDU File - MOS03 MOS03 -- MOS03 0599 CA76 -- MOS03 0600 CA76 ;GS ($1D) Define graphics origin -- MOS03 0601 CA76 -- MOS03 0602 CA76 ;GSA Define graphics origin -- MOS03 0603 CA76 ;The co-ordinates are in external 16 bit space. This does not -- MOS03 0604 CA76 ;move the windows, but does move the graphics cursors -- MOS03 0605 CA76 -- MOS03 0606 CA76 A2 20 GS LDXIM QEND-&03-V -- MOS03 0607 CA78 A0 0C LDYIM ORG-V ;Copy the new origin (external co-ords) to ORGY.. -- MOS03 0608 CA7A 20 41 D4 JSR COPYF -- MOS03 0609 CA7D [ MOS125 = &FF -- MOS03 0630 CA7D | -- MOS03 0631 CA7D ;IEG Inverse of EIG. Converts Icursor to Ecursor -- MOS03 0632 CA7D -- MOS03 0633 CA7D A0 10 IEG LDYIM GCSR-V ;Copy GCSIY to GCSY -- MOS03 0634 CA7F 20 3F D4 JSR COPYFB -- MOS03 0635 CA82 A2 02 LDXIM &02 ;Convert y co-ordinates -- MOS03 0636 CA84 A0 02 LDYIM &02 ;by multiplying by 4 -- MOS03 0637 CA86 20 99 CA JSR IEGC -- MOS03 0638 CA89 A2 00 LDXIM &00 ;Convert x co-ordinates -- MOS03 0639 CA8B A0 05 LDYIM &05 ;By multiplying by 2 -- MOS03 0640 CA8D AD 61 03 LDA NPIX ;4, or 8, depending on (NPIX) -- MOS03 0641 CA90 88 IEGA DEY MOS03 0643 CA92 ^7C MOS03 0642 CA91 4A LSRA MOS03 0643 CA92 ^7C MOS03 0643 CA92 D0 FC BNE IEGA -- MOS03 0644 CA94 AD 56 03 LDA MEMODE ;Get memory map type -- MOS03 0645 CA97 F0 06 BEQ IEGE ;=0 if 20K mode in which case skip one multiplication MOS03 0645 CA97 v79 MOS03 0646 CA99 MOS03 0645 CA97 v79 MOS03 0647 CA99 1E 10 03 IEGC ASLAX GCSR MOS03 0651 CAA0 ^77 MOS03 0648 CA9C 3E 11 03 ROLAX GCSR+&01 MOS03 0651 CAA0 ^77 MOS03 0649 CA9F IEGE MOS03 0651 CAA0 ^77 MOS03 0650 CA9F 88 DEY MOS03 0651 CAA0 ^77 MOS03 0651 CAA0 D0 F7 BNE IEGC -- MOS03 0652 CAA2 38 SEC ;Now subtract off origin to give external co-ordinate -- MOS03 0653 CAA3 20 A7 CA JSR IEGD -- MOS03 0654 CAA6 E8 INX -- MOS03 0655 CAA7 BD 10 03 IEGD LDAAX GCSR -- MOS03 0656 CAAA FD 0C 03 SBCAX ORG -- MOS03 0657 CAAD 9D 10 03 STAAX GCSR -- MOS03 0658 CAB0 60 RTS -- MOS03 0659 CAB1 ] -- MOS03 0660 CAB1 LNK MOS04 -- MOS04 0001 CAB1 -- MOS04 0002 CAB1 TTL VDU File - MOS04 -- MOS04 0003 CAB1 OPT MOS04 MOS04 MOS04 MOS04 MOS04 Acorn macro assembler Page 20 MOS04 VDU File - MOS04 MOS04 -- MOS04 0004 CAB1 ;Last revision 02/06/82 -- MOS04 0005 CAB1 -- MOS04 0006 CAB1 ;02/06/82 Implode/Explode font change, RESET (fonts) changed -- MOS04 0007 CAB1 ;26/05/82 Replace table TBZTBX with LSRA -- MOS04 0008 CAB1 ;19/05/82 Compress PAGEE code -- MOS04 0009 CAB1 ;18/05/82 Conditional coding to remove bug from PAGE -- MOS04 0010 CAB1 ;01/05/82 Considerable recoding for new variable order & forward queueing -- MOS04 0011 CAB1 ;19/04/82 BYTE squashing -- MOS04 0012 CAB1 ;24/03/82 Add soft font implosion & explosion -- MOS04 0013 CAB1 ; Change refs. to BEGSCN+1 to BEGSCN -- MOS04 0014 CAB1 ;08/02/82 Remove initialisation of TRMCH -- MOS04 0015 CAB1 ;07/01/82 Remove initialisation of VDUVEC -- MOS04 0016 CAB1 ;16/11 Bug fix - page mode only at bottom line of window -- MOS04 0017 CAB1 ;14/11 Initialisation of DOTS removed -- MOS04 0018 CAB1 ;28/10 Initialisation of FNTFLG -- MOS04 0019 CAB1 -- MOS04 0020 CAB1 ;Get address of line below -- MOS04 0021 CAB1 -- MOS04 0022 CAB1 48 ADDROW PHA -- MOS04 0023 CAB2 8A TXA -- MOS04 0024 CAB3 18 CLC -- MOS04 0025 CAB4 6D 52 03 ADC BYTROW -- MOS04 0026 CAB7 AA TAX -- MOS04 0027 CAB8 68 PLA -- MOS04 0028 CAB9 6D 53 03 ADC BYTROW +&01 -- MOS04 0029 CABC 60 RTS -- MOS04 0030 CABD -- MOS04 0031 CABD ;Is page mode on ? -- MOS04 0032 CABD -- MOS04 0033 CABD ;CTRL and SHIFT keys pressed (c=1) -- MOS04 0034 CABD -- MOS04 0035 CABD 20 F1 CA PAGEF JSR PAGED ;reset LINES, N.B. does not corrupt c MOS04 0039 CAC5 ^76 MOS04 0036 CAC0 ; If c=1 => set both LEDs MOS04 0039 CAC5 ^76 MOS04 0037 CAC0 20 DE E9 PAGE JSR MOSTST ;pause if CTRL and SHIFT keys pressed MOS04 0039 CAC5 ^76 MOS04 0038 CAC3 90 02 BCC PAGEE ;[CTRL not pressed] MOS04 0039 CAC5 ^76 MOS04 0039 CAC5 30 F6 BMI PAGEF ;[CTRL and SHIFT keys pressed ,c=1] MOS04 0038 CAC3 v7D MOS04 0040 CAC7 ; CTRL without SHIFT MOS04 0038 CAC3 v7D MOS04 0041 CAC7 MOS04 0038 CAC3 v7D MOS04 0042 CAC7 [ PAGEFX =0 ;TRUE if bug in page to be fixed MOS04 0038 CAC3 v7D MOS04 0043 CAC7 A5 D0 PAGEE LDA STATS -- MOS04 0044 CAC9 49 04 EORIM &04 ;invert page mode bit -- MOS04 0045 CACB 29 46 ANDIM &46 ;Exit if C.E. or scroll disabled, or not in page mode -- MOS04 0046 CACD D0 2A BNE PAGEX MOS04 0046 CACD v55 MOS04 0047 CACF | MOS04 0046 CACD v55 MOS04 0052 CACF ] MOS04 0046 CACD v55 MOS04 0053 CACF MOS04 0046 CACD v55 MOS04 0054 CACF AD 69 02 LDA LINES ;Is a page printed yet ? MOS04 0046 CACD v55 MOS04 0055 CAD2 30 22 BMI PAGEA ;If -ve, then reset (more down scrolls than up) MOS04 0046 CACD v55 MOS04 0056 CAD4 ; ensure on bottom line of text window MOS04 0046 CACD v55 MOS04 0057 CAD4 AD 19 03 LDA CSY MOS04 0046 CACD v55 MOS04 0058 CAD7 CD 09 03 CMP TWBROW MOS04 0046 CACD v55 MOS04 0059 CADA 90 1A BCC PAGEA ;[not on bottom line of text window] MOS04 0046 CACD v55 MOS04 0060 CADC ; deal with overlap MOS04 0046 CACD v55 MOS04 0061 CADC 4A LSRA MOS04 0046 CACD v55 MOS04 0062 CADD 4A LSRA MOS04 0046 CACD v55 MOS04 0063 CADE 38 SEC MOS04 0046 CACD v55 MOS04 0064 CADF 6D 69 02 ADC LINES MOS04 0046 CACD v55 MOS04 0065 CAE2 6D 0B 03 ADC TWTROW ;(c=0) MOS04 0046 CACD v55 MOS04 0066 CAE5 CD 09 03 CMP TWBROW MOS04 0046 CACD v55 MOS04 0067 CAE8 90 0C BCC PAGEA ;No, then continue MOS04 0046 CACD v55 MOS04 0068 CAEA 18 CLC ;do not set LEDs on first scroll test MOS04 0046 CACD v55 MOS04 0069 CAEB ;wait for shift key MOS04 0046 CACD v55 MOS04 0070 CAEB 20 DE E9 PAGEC JSR MOSTST MOS04 0046 CACD v55 MOS04 0071 CAEE 38 SEC ;test LEDs on subsequent scroll tests MOS04 0046 CACD v55 MOS04 0072 CAEF 10 FA BPL PAGEC MOS04 0046 CACD v55 MOS04 0073 CAF1 A9 FF PAGED LDAIM &FF ;Reinitialise LINES MOS04 0046 CACD v55 MOS04 0074 CAF3 8D 69 02 STA LINES MOS04 0046 CACD v55 MOS04 0075 CAF6 EE 69 02 PAGEA INC LINES MOS04 0046 CACD v55 MOS04 0076 CAF9 60 PAGEX RTS -- MOS04 0077 CAFA -- MOS04 0078 CAFA ;INTIALISATION ROUTINE -- MOS04 0079 CAFA ;Initial mode in (A) -- MOS04 0080 CAFA -- MOS04 0081 CAFA 48 RESET PHA ;Push mode -- MOS04 0082 CAFB A2 7F LDXIM VEND-V ;Clear all variables -- MOS04 0083 CAFD A9 00 LDAIM &00 -- MOS04 0084 CAFF 85 D0 STA STATS -- MOS04 0085 CB01 9D FF 02 RESETA STAAX V-&01 MOS04 0087 CB05 ^7A MOS04 0086 CB04 CA DEX MOS04 0087 CB05 ^7A MOS04 0087 CB05 D0 FA BNE RESETA -- MOS04 0088 CB07 ; X=0 **** AND EQ status (used by FONT) **** -- MOS04 0089 CB07 20 FD CC JSR FONT ;Ensure font imploded -- MOS04 0090 CB0A 68 PLA ;Pull the mode back again -- MOS04 0091 CB0B A2 7F LDXIM &7F ;Initialise CHCSR to character for DEL -- MOS04 0092 CB0D 8E 66 03 STX CHCSR ;and fall through to ... -- MOS04 0093 CB10 -- MOS04 0094 CB10 ;MODE CHANGE -- MOS04 0095 CB10 -- MOS04 0096 CB10 2C 8E 02 CHMODE BIT MODEL ;adjust according to model -- MOS04 0097 CB13 30 02 BMI CHMOD1 ;[model B] MOS04 0097 CB13 v7D MOS04 0098 CB15 09 04 ORAIM &04 ;model A MOS04 0097 CB13 v7D MOS04 0099 CB17 29 07 CHMOD1 ANDIM &07 -- MOS04 0100 CB19 AA TAX -- MOS04 0101 CB1A 8E 55 03 STX MODE ;Initialise MODE -- MOS04 0102 CB1D BD 14 C4 LDAAX COLMOD ;Get no. colours -- MOS04 0103 CB20 8D 60 03 STA NCOLOR ;=0 if TTX -- MOS04 0104 CB23 BD FF C3 LDAAX BYTCHT ;No. bytes / char. -- MOS04 0105 CB26 8D 4F 03 STA BYTCH -- MOS04 0106 CB29 BD 3A C4 LDAAX NPIXTB ;no. pixles per byte -1, =0 if non-graphics mode -- MOS04 0107 CB2C 8D 61 03 STA NPIX -- MOS04 0108 CB2F D0 02 BNE CHMODB MOS04 0108 CB2F v7D MOS04 0109 CB31 A9 07 LDAIM &07 ;Initialise left and right masks for read character MOS04 0108 CB2F v7D MOS04 0110 CB33 0A CHMODB ASLA ;Define left and right masks. PRESERVE c !!! -- MOS04 0111 CB34 A8 TAY -- MOS04 0112 CB35 B9 06 C4 LDAAY MASKTB -&01 ;Offset to right mask -- MOS04 0113 CB38 8D 63 03 STA MASKR -- MOS04 0114 CB3B 0A CHMODC ASLA MOS04 0115 CB3C ^7D MOS04 0115 CB3C 10 FD BPL CHMODC ;Generate left most mask -- MOS04 0116 CB3E 8D 62 03 STA MASKL ;c=0 - preserve until byte width type generated -- MOS04 0117 CB41 BC 40 C4 LDYAX MODETB ;Memory map type -- MOS04 0118 CB44 8C 56 03 STY MEMODE -- MOS04 0119 CB47 B9 4F C4 LDAAY CZERO ;Initialise C0 -- MOS04 0120 CB4A 20 FD E9 JSR CREG ;must preserve c=0 -- MOS04 0121 CB4D B9 4B C4 LDAAY CONE -- MOS04 0122 CB50 20 FD E9 JSR CREG -- MOS04 0123 CB53 B9 59 C4 LDAAY BYTSTA ;Total bytes dsp.'ed -- MOS04 0124 CB56 8D 54 03 STA BYTSCN -- MOS04 0125 CB59 B9 5E C4 LDAAY STSCTB ;Addr. 1st to disp'ed -- MOS04 0126 CB5C 8D 4E 03 STA BEGSCN -- MOS04 0127 CB5F [ MOS125 = &FF -- MOS04 0133 CB5F | MOS04 MOS04 MOS04 MOS04 Acorn macro assembler Page 21 MOS04 VDU File - MOS04 MOS04 -- MOS04 0134 CB5F 98 TYA ;Get byte width type -- MOS04 0135 CB60 49 07 EORIM &07 -- MOS04 0136 CB62 4A LSRA -- MOS04 0137 CB63 AA TAX -- MOS04 0138 CB64 CA DEX ;Map (0,1,2,3,4) to (2,2,1,1,0) -- MOS04 0139 CB65 ] -- MOS04 0140 CB65 BD 66 C4 LDAAX TBZTBA ;LSB of table addr. -- MOS04 0141 CB68 85 E0 STA ZTBL -- MOS04 0142 CB6A A9 C3 LDAIM /(HRGTB ) ;MSB of same (always the same) -- MOS04 0143 CB6C 85 E1 STA ZTBL +&01 -- MOS04 0144 CB6E BD 63 C4 LDAAX BYTRTA ;Byte width of row -- MOS04 0145 CB71 8D 52 03 STA BYTROW -- MOS04 0146 CB74 8E 53 03 STX BYTROW +&01 -- MOS04 0147 CB77 A9 43 LDAIM &43 ;Preserve b6, b1 & b0 of STATS only -- MOS04 0148 CB79 20 A7 C5 JSR STTAND ;Clear all others -- MOS04 0149 CB7C AE 55 03 LDX MODE ;Indirect mode to mMODREG -- MOS04 0150 CB7F BD F7 C3 LDAAX INDMOD ;from this table -- MOS04 0151 CB82 20 05 EA JSR MVPRC0 ;as close as possible to the reprogramming of the 6845 -- MOS04 0152 CB85 -- MOS04 0153 CB85 ;PROGRAMME THE 6845 -- MOS04 0154 CB85 -- MOS04 0155 CB85 08 PHP -- MOS04 0156 CB86 78 SEI -- MOS04 0157 CB87 BE 69 C4 LDXAY CRTCX ;Get the table to Xmt -- MOS04 0158 CB8A A0 0B LDYIM &0B ;No. bytes to feed it -- MOS04 0159 CB8C BD 6E C4 CRTCLP LDAAX CRTCTB ;Load byte to MOS04 0163 CB94 ^76 MOS04 0160 CB8F 20 34 C9 JSR CRTCP ;Programme the 6845 and save value of cursor start MOS04 0163 CB94 ^76 MOS04 0161 CB92 CA DEX MOS04 0163 CB94 ^76 MOS04 0162 CB93 88 DEY MOS04 0163 CB94 ^76 MOS04 0163 CB94 10 F6 BPL CRTCLP -- MOS04 0164 CB96 28 PLP -- MOS04 0165 CB97 -- MOS04 0166 CB97 20 3F C8 JSR DCD ;Default log.phys. cols. -- MOS04 0167 CB9A 20 93 C9 JSR SUB ;Clear any windowing -- MOS04 0168 CB9D -- MOS04 0169 CB9D ;fall through to ..... -- MOS04 0170 CB9D -- MOS04 0171 CB9D A2 00 CLATXT LDXIM &00 ;TOPSCN:=BEGSCN -- MOS04 0172 CB9F AD 4E 03 LDA BEGSCN ;Load must be in this to ensure n=0, tested in CSDSPA -- MOS04 0173 CBA2 8E 50 03 STX TOPSCN -- MOS04 0174 CBA5 8D 51 03 STA TOPSCN +&01 -- MOS04 0175 CBA8 20 CC C9 JSR CSDSPA ;Home cursor -- MOS04 0176 CBAB A0 0C LDYIM &0C ;Take divided address -- MOS04 0177 CBAD 20 FF C9 JSR AXCRTC -- MOS04 0178 CBB0 AD 58 03 LDA BTCOLF -- MOS04 0179 CBB3 AE 56 03 LDX MEMODE ;Get mem.map type -- MOS04 0180 CBB6 BC 54 C4 LDYAX CLSCTA ;Set up jump vector -- MOS04 0181 CBB9 8C 5D 03 STY JVEC -- MOS04 0182 CBBC A0 CC LDYIM /(CLASCA ) ;Used to be LDYAX CLSCTB -- MOS04 0183 CBBE 8C 5E 03 STY JVEC +&01 -- MOS04 0184 CBC1 A2 00 LDXIM &00 -- MOS04 0185 CBC3 8E 69 02 STX LINES ;Initialise the number of lines scrolled -- MOS04 0186 CBC6 8E 18 03 STX CSX -- MOS04 0187 CBC9 8E 19 03 STX CSY -- MOS04 0188 CBCC 6C 5D 03 JMI JVEC -- MOS04 0189 CBCF -- MOS04 0190 CBCF RCHDEF -- MOS04 0191 CBCF 20 50 D0 JSR CHADDR ;Read character definition -- MOS04 0192 CBD2 A0 00 LDYIM &00 ;Address character (start of defn. now in ZTEMPC) -- MOS04 0193 CBD4 B1 DE PRABA LDAIY ZTEMPC ;Copy definition MOS04 0197 CBDB ^77 MOS04 0194 CBD6 C8 INY MOS04 0197 CBDB ^77 MOS04 0195 CBD7 91 F0 STAIY WARGS MOS04 0197 CBDB ^77 MOS04 0196 CBD9 C0 08 CPYIM &08 MOS04 0197 CBDB ^77 MOS04 0197 CBDB D0 F7 BNE PRABA -- MOS04 0198 CBDD 60 RTS -- MOS04 0199 CBDE -- MOS04 0200 CBDE [ MOS125 = &FF -- MOS04 0201 CBDE | -- MOS04 0202 CBDE ;Get the next line up, -- MOS04 0203 CBDE ;test if wraparound -- MOS04 0204 CBDE ;This is here as padding -- MOS04 0205 CBDE -- MOS04 0206 CBDE 48 SUBROW PHA -- MOS04 0207 CBDF 8A TXA -- MOS04 0208 CBE0 38 SEC -- MOS04 0209 CBE1 ED 52 03 SBC BYTROW -- MOS04 0210 CBE4 AA TAX -- MOS04 0211 CBE5 68 PLA -- MOS04 0212 CBE6 ED 53 03 SBC BYTROW +&01 -- MOS04 0213 CBE9 CD 4E 03 CMP BEGSCN -- MOS04 0214 CBEC 60 RTS -- MOS04 0215 CBED -- MOS04 0216 CBED ;NORTH -- MOS04 0217 CBED -- MOS04 0218 CBED ; Returns zero false -- MOS04 0219 CBED 38 NBDY SEC -- MOS04 0220 CBEE A5 D6 LDA ZMEMG -- MOS04 0221 CBF0 ED 52 03 SBC BYTROW -- MOS04 0222 CBF3 85 D6 STA ZMEMG -- MOS04 0223 CBF5 A5 D7 LDA ZMEMG +&01 -- MOS04 0224 CBF7 ED 53 03 SBC BYTROW +&01 -- MOS04 0225 CBFA CD 4E 03 CMP BEGSCN ;Wraparound ? -- MOS04 0226 CBFD B0 03 BCS NBDYA MOS04 0226 CBFD v7C MOS04 0227 CBFF 6D 54 03 ADC BYTSCN MOS04 0226 CBFD v7C MOS04 0228 CC02 85 D7 NBDYA STA ZMEMG +&01 -- MOS04 0229 CC04 A0 07 LDYIM &07 -- MOS04 0230 CC06 60 RTS -- MOS04 0231 CC07 ] -- MOS04 0232 CC07 -- MOS04 0233 CC07 9D 00 30 CLASCA STAAX &3000 ;Modes 1-3 (20K) -- MOS04 0234 CC0A 9D 00 31 STAAX &3100 -- MOS04 0235 CC0D 9D 00 32 STAAX &3200 -- MOS04 0236 CC10 9D 00 33 STAAX &3300 -- MOS04 0237 CC13 9D 00 34 STAAX &3400 -- MOS04 0238 CC16 9D 00 35 STAAX &3500 -- MOS04 0239 CC19 9D 00 36 STAAX &3600 -- MOS04 0240 CC1C 9D 00 37 STAAX &3700 -- MOS04 0241 CC1F 9D 00 38 STAAX &3800 -- MOS04 0242 CC22 9D 00 39 STAAX &3900 -- MOS04 0243 CC25 9D 00 3A STAAX &3A00 -- MOS04 0244 CC28 9D 00 3B STAAX &3B00 -- MOS04 0245 CC2B 9D 00 3C STAAX &3C00 -- MOS04 0246 CC2E 9D 00 3D STAAX &3D00 -- MOS04 0247 CC31 9D 00 3E STAAX &3E00 -- MOS04 0248 CC34 9D 00 3F STAAX &3F00 -- MOS04 0249 CC37 9D 00 40 CLASCB STAAX &4000 ;Mode 3 (16k) -- MOS04 0250 CC3A 9D 00 41 STAAX &4100 -- MOS04 0251 CC3D 9D 00 42 STAAX &4200 -- MOS04 0252 CC40 9D 00 43 STAAX &4300 -- MOS04 0253 CC43 9D 00 44 STAAX &4400 -- MOS04 0254 CC46 9D 00 45 STAAX &4500 MOS04 MOS04 MOS04 MOS04 Acorn macro assembler Page 22 MOS04 VDU File - MOS04 MOS04 -- MOS04 0255 CC49 9D 00 46 STAAX &4600 -- MOS04 0256 CC4C 9D 00 47 STAAX &4700 -- MOS04 0257 CC4F 9D 00 48 STAAX &4800 -- MOS04 0258 CC52 9D 00 49 STAAX &4900 -- MOS04 0259 CC55 9D 00 4A STAAX &4A00 -- MOS04 0260 CC58 9D 00 4B STAAX &4B00 -- MOS04 0261 CC5B 9D 00 4C STAAX &4C00 -- MOS04 0262 CC5E 9D 00 4D STAAX &4D00 -- MOS04 0263 CC61 9D 00 4E STAAX &4E00 -- MOS04 0264 CC64 9D 00 4F STAAX &4F00 -- MOS04 0265 CC67 9D 00 50 STAAX &5000 -- MOS04 0266 CC6A 9D 00 51 STAAX &5100 -- MOS04 0267 CC6D 9D 00 52 STAAX &5200 -- MOS04 0268 CC70 9D 00 53 STAAX &5300 -- MOS04 0269 CC73 9D 00 54 STAAX &5400 -- MOS04 0270 CC76 9D 00 55 STAAX &5500 -- MOS04 0271 CC79 9D 00 56 STAAX &5600 -- MOS04 0272 CC7C 9D 00 57 STAAX &5700 -- MOS04 0273 CC7F 9D 00 58 CLASCC STAAX &5800 ;Modes 4,5 (10K) -- MOS04 0274 CC82 9D 00 59 STAAX &5900 -- MOS04 0275 CC85 9D 00 5A STAAX &5A00 -- MOS04 0276 CC88 9D 00 5B STAAX &5B00 -- MOS04 0277 CC8B 9D 00 5C STAAX &5C00 -- MOS04 0278 CC8E 9D 00 5D STAAX &5D00 -- MOS04 0279 CC91 9D 00 5E STAAX &5E00 -- MOS04 0280 CC94 9D 00 5F STAAX &5F00 -- MOS04 0281 CC97 9D 00 60 CLASCD STAAX &6000 ;Mode 6 (8k) -- MOS04 0282 CC9A 9D 00 61 STAAX &6100 -- MOS04 0283 CC9D 9D 00 62 STAAX &6200 -- MOS04 0284 CCA0 9D 00 63 STAAX &6300 -- MOS04 0285 CCA3 9D 00 64 STAAX &6400 -- MOS04 0286 CCA6 9D 00 65 STAAX &6500 -- MOS04 0287 CCA9 9D 00 66 STAAX &6600 -- MOS04 0288 CCAC 9D 00 67 STAAX &6700 -- MOS04 0289 CCAF 9D 00 68 STAAX &6800 -- MOS04 0290 CCB2 9D 00 69 STAAX &6900 -- MOS04 0291 CCB5 9D 00 6A STAAX &6A00 -- MOS04 0292 CCB8 9D 00 6B STAAX &6B00 -- MOS04 0293 CCBB 9D 00 6C STAAX &6C00 -- MOS04 0294 CCBE 9D 00 6D STAAX &6D00 -- MOS04 0295 CCC1 9D 00 6E STAAX &6E00 -- MOS04 0296 CCC4 9D 00 6F STAAX &6F00 -- MOS04 0297 CCC7 9D 00 70 STAAX &7000 -- MOS04 0298 CCCA 9D 00 71 STAAX &7100 -- MOS04 0299 CCCD 9D 00 72 STAAX &7200 -- MOS04 0300 CCD0 9D 00 73 STAAX &7300 -- MOS04 0301 CCD3 9D 00 74 STAAX &7400 -- MOS04 0302 CCD6 9D 00 75 STAAX &7500 -- MOS04 0303 CCD9 9D 00 76 STAAX &7600 -- MOS04 0304 CCDC 9D 00 77 STAAX &7700 -- MOS04 0305 CCDF 9D 00 78 STAAX &7800 -- MOS04 0306 CCE2 9D 00 79 STAAX &7900 -- MOS04 0307 CCE5 9D 00 7A STAAX &7A00 -- MOS04 0308 CCE8 9D 00 7B STAAX &7B00 -- MOS04 0309 CCEB 9D 00 7C CLASCE STAAX &7C00 ;Mode 7 (1k = TTX) -- MOS04 0310 CCEE 9D 00 7D STAAX &7D00 -- MOS04 0311 CCF1 9D 00 7E STAAX &7E00 -- MOS04 0312 CCF4 9D 00 7F STAAX &7F00 -- MOS04 0313 CCF7 E8 INX -- MOS04 0314 CCF8 F0 61 BEQ ENSCRX MOS04 0314 CCF8 v1E MOS04 0315 CCFA 6C 5D 03 RUNNER JMI JVEC MOS04 0314 CCF8 v1E MOS04 0316 CCFD MOS04 0314 CCF8 v1E MOS04 0317 CCFD [ MOS125 = &FF MOS04 0314 CCF8 v1E MOS04 0332 CCFD ] MOS04 0314 CCF8 v1E MOS04 0333 CCFD MOS04 0314 CCF8 v1E MOS04 0334 CCFD FONT MOS04 0314 CCF8 v1E MOS04 0335 CCFD ; MOS04 0314 CCF8 v1E MOS04 0336 CCFD ; implode font MOS04 0314 CCF8 v1E MOS04 0337 CCFD ; MOS04 0314 CCF8 v1E MOS04 0338 CCFD A9 0F LDAIM &0F ;Fonts 1,2,3 hard (set 0). MSb not used MOS04 0314 CCF8 v1E MOS04 0339 CCFF 8D 67 03 STA FNTFLG MOS04 0314 CCF8 v1E MOS04 0340 CD02 ; MOS04 0314 CCF8 v1E MOS04 0341 CD02 A9 0C LDAIM SFPAGE MOS04 0314 CCF8 v1E MOS04 0342 CD04 A0 06 LDYIM &06 ;Set Fonts 1 to 7 to page SFPAGE MOS04 0314 CCF8 v1E MOS04 0343 CD06 99 68 03 FIMPA STAAY PGSFNT MOS04 0314 CCF8 v1E MOS04 0344 CD09 88 DEY MOS04 0314 CCF8 v1E MOS04 0345 CD0A 10 FA BPL FIMPA MOS04 0314 CCF8 v1E MOS04 0346 CD0C ; MOS04 0314 CCF8 v1E MOS04 0347 CD0C ; test operation type MOS04 0314 CCF8 v1E MOS04 0348 CD0C ; MOS04 0314 CCF8 v1E MOS04 0349 CD0C ; force X in range MOS04 0314 CCF8 v1E MOS04 0350 CD0C E0 07 CPXIM &07 MOS04 0314 CCF8 v1E MOS04 0351 CD0E 90 02 BCC FONTOK ;[X <= 6] MOS04 0314 CCF8 v1E MOS04 0352 CD10 A2 06 LDXIM &06 MOS04 0314 CCF8 v1E MOS04 0353 CD12 FONTOK ;0 <= X <= 6 MOS04 0314 CCF8 v1E MOS04 0354 CD12 8E 46 02 STX FONTSW ;record font state MOS04 0314 CCF8 v1E MOS04 0355 CD15 ; MOS04 0314 CCF8 v1E MOS04 0356 CD15 AD 43 02 LDA IHWM MOS04 0314 CCF8 v1E MOS04 0357 CD18 ; MOS04 0314 CCF8 v1E MOS04 0358 CD18 ; explode fonts that lie within extension pages MOS04 0314 CCF8 v1E MOS04 0359 CD18 ; MOS04 0314 CCF8 v1E MOS04 0360 CD18 A2 00 LDXIM &00 MOS04 0314 CCF8 v1E MOS04 0361 CD1A FEXPA MOS04 0314 CCF8 v1E MOS04 0362 CD1A EC 46 02 CPX FONTSW MOS04 0314 CCF8 v1E MOS04 0363 CD1D B0 0B BCS FEXPA0 MOS04 0314 CCF8 v1E MOS04 0364 CD1F ; C=0 MOS04 0314 CCF8 v1E MOS04 0365 CD1F BC BA C4 LDYAX FFSZOT MOS04 0314 CCF8 v1E MOS04 0366 CD22 99 68 03 STAAY PGSFNT MOS04 0314 CCF8 v1E MOS04 0367 CD25 ; C=0 MOS04 0314 CCF8 v1E MOS04 0368 CD25 69 01 ADCIM &01 MOS04 0314 CCF8 v1E MOS04 0369 CD27 E8 INX MOS04 0314 CCF8 v1E MOS04 0370 CD28 D0 F0 BNE FEXPA ;[ALWAYS jump] MOS04 0314 CCF8 v1E MOS04 0371 CD2A FEXPA0 MOS04 0314 CCF8 v1E MOS04 0372 CD2A ; MOS04 0314 CCF8 v1E MOS04 0373 CD2A ;X = FONTSW MOS04 0314 CCF8 v1E MOS04 0374 CD2A 8D 44 02 STA HWM MOS04 0314 CCF8 v1E MOS04 0375 CD2D ; MOS04 0314 CCF8 v1E MOS04 0376 CD2D A8 TAY MOS04 0314 CCF8 v1E MOS04 0377 CD2E F0 2B BEQ FONT0 MOS04 0314 CCF8 v1E MOS04 0378 CD30 A2 11 LDXIM SVHWMC MOS04 0314 CCF8 v1E MOS04 0379 CD32 4C 74 F1 JMP SVOP MOS04 0314 CCF8 v1E MOS04 0380 CD35 MOS04 0314 CCF8 v1E MOS04 0381 CD35 MOS04 0314 CCF8 v1E MOS04 0382 CD35 LNK MOS05 MOS04 0314 CCF8 v1E MOS05 0001 CD35 MOS04 0314 CCF8 v1E MOS05 0002 CD35 TTL VDU File - MOS05 MOS04 0314 CCF8 v1E MOS05 0003 CD35 OPT MOS05 MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 23 MOS05 VDU File - MOS05 MOS05 MOS04 0314 CCF8 v1E MOS05 0004 CD35 ; MOS04 0314 CCF8 v1E MOS05 0005 CD35 ;Last update 05/05/82 MOS04 0314 CCF8 v1E MOS05 0006 CD35 MOS04 0314 CCF8 v1E MOS05 0007 CD35 ;05/05/82 RSAN corrected MOS04 0314 CCF8 v1E MOS05 0008 CD35 ;05/05/82 TADDRY changed to allow for only 1 table MOS04 0314 CCF8 v1E MOS05 0009 CD35 ;01/05/82 Recoded using new variable order & manifests MOS04 0314 CCF8 v1E MOS05 0010 CD35 ;01/05/82 Recode for new order of variables MOS04 0314 CCF8 v1E MOS05 0011 CD35 ;22/04/82 Encode ADDSCN & SUBSCN MOS04 0314 CCF8 v1E MOS05 0012 CD35 ;19/04/82 Comments added plus small byte squash MOS04 0314 CCF8 v1E MOS05 0013 CD35 ;25/03/82 Change all refs. to BEGSCN+1 to BEGSCN MOS04 0314 CCF8 v1E MOS05 0014 CD35 MOS04 0314 CCF8 v1E MOS05 0015 CD35 ;Account for scroll disabling if needs be MOS04 0314 CCF8 v1E MOS05 0016 CD35 ;Requires c=1 if scroll DOWN (cursor up) & vice versa MOS04 0314 CCF8 v1E MOS05 0017 CD35 ;If scroll enabled (b1 of STATS =0) adjusts PCSY unless on a margin MOS04 0314 CCF8 v1E MOS05 0018 CD35 ;If scroll disabled, wraps cursor, pulls return address from stack MOS04 0314 CCF8 v1E MOS05 0019 CD35 ;and jumps to CSDA. MOS04 0314 CCF8 v1E MOS05 0020 CD35 MOS04 0314 CCF8 v1E MOS05 0021 CD35 A9 02 ENSCRL LDAIM &02 ;Is scroll disabled ? MOS04 0314 CCF8 v1E MOS05 0022 CD37 24 D0 BIT STATS MOS04 0314 CCF8 v1E MOS05 0023 CD39 D0 02 BNE ENSCRM ;Yes?, then skip MOS04 0314 CCF8 v1E MOS05 0024 CD3B 50 32 BVC ENSCRR ;Or is CE set ? MOS04 0314 CCF8 v1E MOS05 0025 CD3D AD 09 03 ENSCRM LDA TWBROW ;Assume scroll up (so go to bottom row) MOS04 0314 CCF8 v1E MOS05 0026 CD40 90 03 BCC ENSCRN ;Unless c=1 MOS04 0314 CCF8 v1E MOS05 0027 CD42 AD 0B 03 LDA TWTROW ;Whence scroll DOWN (& go to top row) MOS04 0314 CCF8 v1E MOS05 0028 CD45 70 08 ENSCRN BVS ENSCRO ;If OUTPUT cursor, skip MOS04 0314 CCF8 v1E MOS05 0029 CD47 8D 19 03 STA CSY ;(this assumes windows are rectangular!) MOS04 0314 CCF8 v1E MOS05 0030 CD4A 68 PLA ;Cheat return stack MOS04 0314 CCF8 v1E MOS05 0031 CD4B 68 PLA MOS04 0314 CCF8 v1E MOS05 0032 CD4C 4C AE C6 JMP CSDA MOS04 0314 CCF8 v1E MOS05 0033 CD4F 08 ENSCRO PHP ;To preserve carry MOS04 0314 CCF8 v1E MOS05 0034 CD50 CD 65 03 CMP PCSY ;Would the input cursor like to go off screen ? MOS04 0314 CCF8 v1E MOS05 0035 CD53 F0 19 BEQ ENSCRP ;Yes?, then don't readdress it MOS04 0314 CCF8 v1E MOS05 0036 CD55 28 PLP ;Restore the carry, to see which way to go MOS04 0314 CCF8 v1E MOS05 0037 CD56 90 04 BCC ENSCRQ MOS04 0314 CCF8 v1E MOS05 0038 CD58 CE 65 03 DEC PCSY ;Scroll DOWN, so follow it down MOS04 0314 CCF8 v1E MOS05 0039 CD5B [ MOS125 = &FF MOS04 0314 CCF8 v1E MOS05 0040 CD5B | MOS04 0314 CCF8 v1E MOS05 0041 CD5B FONT0 MOS04 0314 CCF8 v1E MOS05 0042 CD5B ] MOS04 0314 CCF8 v1E MOS05 0043 CD5B 60 ENSCRX RTS ;May be referenced from MOS04 MOS05 0024 CD3B v4D MOS05 0044 CD5C EE 65 03 ENSCRQ INC PCSY ;Scroll UP, so go up as well MOS05 0024 CD3B v4D MOS05 0045 CD5F 60 RTS MOS05 0024 CD3B v4D MOS05 0046 CD60 MOS05 0024 CD3B v4D MOS05 0047 CD60 ;OCSRDL Delete output cursor MOS05 0024 CD3B v4D MOS05 0048 CD60 MOS05 0024 CD3B v4D MOS05 0049 CD60 08 OCSRDL PHP MOS05 0024 CD3B v4D MOS05 0050 CD61 48 PHA MOS05 0024 CD3B v4D MOS05 0051 CD62 AC 4F 03 LDY BYTCH MOS05 0024 CD3B v4D MOS05 0052 CD65 88 DEY ;TTX? MOS05 0024 CD3B v4D MOS05 0053 CD66 D0 0A BNE OCSRIV ;Not TTX?, then same as writing cursor, as it inverts MOS05 0024 CD3B v4D MOS05 0054 CD68 AD 38 03 LDA TTXTMP ;TTX?, then write remebered byte MOS05 0024 CD3B v4D MOS05 0055 CD6B 91 D8 STAIY ZMEMT ;(Y)=0 MOS05 0024 CD3B v4D MOS05 0056 CD6D 68 OCSREX PLA ;& exit MOS05 0024 CD3B v4D MOS05 0057 CD6E 28 ENSCRP PLP ;Get the stack correct MOS05 0024 CD3B v4D MOS05 0058 CD6F 60 ENSCRR RTS MOS05 0103 CD91 ^5A MOS05 0059 CD70 MOS05 0103 CD91 ^5A MOS05 0060 CD70 ;OCSRWR Write output cursor MOS05 0103 CD91 ^5A MOS05 0061 CD70 MOS05 0103 CD91 ^5A MOS05 0062 CD70 [ MOS125 = &FF MOS05 0103 CD91 ^5A MOS05 0084 CD70 | MOS05 0103 CD91 ^5A MOS05 0085 CD70 08 OCSRWR PHP MOS05 0103 CD91 ^5A MOS05 0086 CD71 48 PHA MOS05 0103 CD91 ^5A MOS05 0087 CD72 A9 3F OCSRIV LDAIM INVSXT MOS05 0103 CD91 ^5A MOS05 0088 CD74 AC 4F 03 LDY BYTCH MOS05 0103 CD91 ^5A MOS05 0089 CD77 C0 20 CPYIM &20 ;Mode 2 ? MOS05 0103 CD91 ^5A MOS05 0090 CD79 F0 13 BEQ OCSRIW ;Yes?, then don't invert the flashing bit MOS05 0103 CD91 ^5A MOS05 0091 CD7B A9 FF LDAIM &FF MOS05 0103 CD91 ^5A MOS05 0092 CD7D 88 DEY ;TTX? MOS05 0103 CD91 ^5A MOS05 0093 CD7E D0 08 BNE OCSRIU MOS05 0103 CD91 ^5A MOS05 0094 CD80 B1 D8 LDAIY ZMEMT ;(Y)=0 Yes?, then read byte directly from screen MOS05 0103 CD91 ^5A MOS05 0095 CD82 8D 38 03 STA TTXTMP ;and store it out of harm's way (no plotting in this mode) MOS05 0103 CD91 ^5A MOS05 0096 CD85 4D 66 03 EOR CHCSR ;Write the cursor MOS05 0103 CD91 ^5A MOS05 0097 CD88 48 OCSRIU PHA MOS05 0103 CD91 ^5A MOS05 0098 CD89 51 D8 EORIY ZMEMT ;Invert the character cell MOS05 0103 CD91 ^5A MOS05 0099 CD8B 91 D8 STAIY ZMEMT MOS05 0103 CD91 ^5A MOS05 0100 CD8D 68 PLA MOS05 0103 CD91 ^5A MOS05 0101 CD8E 88 OCSRIW DEY MOS05 0103 CD91 ^5A MOS05 0102 CD8F 10 F7 BPL OCSRIU MOS05 0103 CD91 ^5A MOS05 0103 CD91 30 DA BMI OCSREX ; Branch always -- MOS05 0104 CD93 ] -- MOS05 0105 CD93 -- MOS05 0106 CD93 ;Soft scrolling (non-anom.) -- MOS05 0107 CD93 -- MOS05 0108 CD93 ;Scroll DOWN -- MOS05 0109 CD93 -- MOS05 0110 CD93 20 5B CE SSCRDN JSR SSCRIN ;Initialise -- MOS05 0111 CD96 AD 09 03 LDA TWBROW ;1st receive address is bottom LH point -- MOS05 0112 CD99 8D 19 03 STA CSY ;(CSX initialised in SSCRIN) -- MOS05 0113 CD9C 20 09 CF JSR TADDRY ;address bottom LH point (guaranteed in window) -- MOS05 0114 CD9F 20 DE CB SSCRDA JSR SUBROW ;Get the address of the LH point of the next line up MOS05 0140 CDC6 ^57 MOS05 0115 CDA2 B0 03 BCS SSCRDB ;Wraparound between these two lines? NO, then continue MOS05 0140 CDC6 ^57 MOS05 0116 CDA4 6D 54 03 ADC BYTSCN ;Yes,then add screen and note we must scroll slowly! MOS05 0140 CDC6 ^57 MOS05 0117 CDA7 85 DB SSCRDB STA ZTEMP +&01 ;store transmit address MOS05 0140 CDC6 ^57 MOS05 0118 CDA9 86 DA STX ZTEMP MOS05 0140 CDC6 ^57 MOS05 0119 CDAB 85 DC STA ZTEMPB ;& MSB of next receive address (LSB is not changed) MOS05 0140 CDC6 ^57 MOS05 0120 CDAD [ MOS125 = &FF MOS05 0140 CDC6 ^57 MOS05 0127 CDAD | MOS05 0140 CDC6 ^57 MOS05 0128 CDAD 90 0A BCC SSCRDC ;c unchanged since just after SSCRDA MOS05 0140 CDC6 ^57 MOS05 0129 CDAF 20 DE CB SSCRDE JSR SUBROW ;Get next line up MOS05 0140 CDC6 ^57 MOS05 0130 CDB2 90 05 BCC SSCRDC ;Wraparound occured ?, then slow scroll to be safe MOS05 0140 CDC6 ^57 MOS05 0131 CDB4 20 38 CE JSR XMIT ;Scroll fast is possible MOS05 0140 CDC6 ^57 MOS05 0132 CDB7 F0 03 BEQ SSCRDD ;xmit returns EQ MOS05 0140 CDC6 ^57 MOS05 0133 CDB9 20 73 CE SSCRDC JSR SSCRS ;Scroll slowly ! MOS05 0140 CDC6 ^57 MOS05 0134 CDBC ] MOS05 0140 CDC6 ^57 MOS05 0135 CDBC A5 DC SSCRDD LDA ZTEMPB ;MSB of next receive address MOS05 0140 CDC6 ^57 MOS05 0136 CDBE A6 DA LDX ZTEMP ;LSB of same MOS05 0140 CDC6 ^57 MOS05 0137 CDC0 85 D9 STA ZMEMT +&01 ;Initialise next receive address MOS05 0140 CDC6 ^57 MOS05 0138 CDC2 86 D8 STX ZMEMT MOS05 0140 CDC6 ^57 MOS05 0139 CDC4 C6 DE DEC ZTEMPC ;Any more lines to copy ? MOS05 0140 CDC6 ^57 MOS05 0140 CDC6 D0 D7 BNE SSCRDA ;Don't bother to copy last line -- MOS05 0141 CDC8 A2 28 SSCREX LDXIM SSWS-V ;Preserve or restore current text cursor MOS05 0216 CE36 ^10 MOS05 0142 CDCA A0 18 LDYIM CSX-V MOS05 0216 CE36 ^10 MOS05 0143 CDCC A9 02 SWAP2 LDAIM &02 MOS05 0216 CE36 ^10 MOS05 0144 CDCE D0 06 BNE SWAP MOS05 0216 CE36 ^10 MOS05 0145 CDD0 A2 24 SWAPB LDXIM GCSIR-V ;SPLOTY requires c preserved MOS05 0216 CE36 ^10 MOS05 0146 CDD2 A0 14 SWAPC LDYIM OLDCS-V MOS05 0216 CE36 ^10 MOS05 0147 CDD4 MOS05 0216 CE36 ^10 MOS05 0148 CDD4 ;SWAPF swaps 4 bytes between (V)+(X) & (V)+(Y) MOS05 0216 CE36 ^10 MOS05 0149 CDD4 MOS05 0216 CE36 ^10 MOS05 0150 CDD4 A9 04 SWAPF LDAIM &04 ;by falling through to ... MOS05 0216 CE36 ^10 MOS05 0151 CDD6 MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 24 MOS05 VDU File - MOS05 MOS05 MOS05 0216 CE36 ^10 MOS05 0152 CDD6 ;SWAP swaps (A) bytes between (V)+(X) & (V)+(Y) MOS05 0216 CE36 ^10 MOS05 0153 CDD6 MOS05 0216 CE36 ^10 MOS05 0154 CDD6 85 DA SWAP STA ZTEMP MOS05 0216 CE36 ^10 MOS05 0155 CDD8 BD 00 03 SWAPA LDAAX V MOS05 0216 CE36 ^10 MOS05 0156 CDDB 48 PHA MOS05 0216 CE36 ^10 MOS05 0157 CDDC B9 00 03 LDAAY V MOS05 0216 CE36 ^10 MOS05 0158 CDDF 9D 00 03 STAAX V MOS05 0216 CE36 ^10 MOS05 0159 CDE2 68 PLA MOS05 0216 CE36 ^10 MOS05 0160 CDE3 99 00 03 STAAY V MOS05 0216 CE36 ^10 MOS05 0161 CDE6 E8 INX MOS05 0216 CE36 ^10 MOS05 0162 CDE7 C8 INY MOS05 0216 CE36 ^10 MOS05 0163 CDE8 C6 DA DEC ZTEMP MOS05 0216 CE36 ^10 MOS05 0164 CDEA D0 EC BNE SWAPA MOS05 0216 CE36 ^10 MOS05 0165 CDEC 60 RTS MOS05 0216 CE36 ^10 MOS05 0166 CDED MOS05 0216 CE36 ^10 MOS05 0167 CDED MOS05 0216 CE36 ^10 MOS05 0168 CDED [ MOS125 = &FF MOS05 0216 CE36 ^10 MOS05 0169 CDED | MOS05 0216 CE36 ^10 MOS05 0170 CDED ;(SORTY exits with (X)<(Y)) MOS05 0216 CE36 ^10 MOS05 0171 CDED MOS05 0216 CE36 ^10 MOS05 0172 CDED A2 20 SORTA LDXIM NEWPT-V MOS05 0216 CE36 ^10 MOS05 0173 CDEF A0 14 LDYIM OLDCS-V MOS05 0216 CE36 ^10 MOS05 0174 CDF1 BD 02 03 SORTY LDAAX V+&02 MOS05 0216 CE36 ^10 MOS05 0175 CDF4 D9 02 03 CMPAY V+&02 MOS05 0216 CE36 ^10 MOS05 0176 CDF7 BD 03 03 LDAAX V+&03 MOS05 0216 CE36 ^10 MOS05 0177 CDFA F9 03 03 SBCAY V+&03 MOS05 0216 CE36 ^10 MOS05 0178 CDFD 10 D5 BPL SWAPF MOS05 0216 CE36 ^10 MOS05 0179 CDFF 60 RTS MOS05 0216 CE36 ^10 MOS05 0180 CE00 ] MOS05 0216 CE36 ^10 MOS05 0181 CE00 MOS05 0216 CE36 ^10 MOS05 0182 CE00 ;Soft scroll UP MOS05 0216 CE36 ^10 MOS05 0183 CE00 MOS05 0216 CE36 ^10 MOS05 0184 CE00 20 5B CE SSCRUP JSR SSCRIN ;Initialise MOS05 0216 CE36 ^10 MOS05 0185 CE03 AC 0B 03 LDY TWTROW ;Receive from top line, LH column MOS05 0216 CE36 ^10 MOS05 0186 CE06 8C 19 03 STY CSY MOS05 0216 CE36 ^10 MOS05 0187 CE09 20 09 CF JSR TADDRY ;Get 1st receive address (point guaranteed in window) MOS05 0216 CE36 ^10 MOS05 0188 CE0C 20 B1 CA SSCRUA JSR ADDROW ;Get line below MOS05 0216 CE36 ^10 MOS05 0189 CE0F 10 04 BPL SSCRUE ;Wraparound ? MOS05 0216 CE36 ^10 MOS05 0190 CE11 38 SEC ;Yes, then correct and scroll slowly MOS05 0216 CE36 ^10 MOS05 0191 CE12 ED 54 03 SBC BYTSCN MOS05 0216 CE36 ^10 MOS05 0192 CE15 85 DB SSCRUE STA ZTEMP +&01 ;Transmit address MOS05 0216 CE36 ^10 MOS05 0193 CE17 86 DA STX ZTEMP MOS05 0216 CE36 ^10 MOS05 0194 CE19 85 DC STA ZTEMPB ;MSB of next receive addr., LSB is preserved MOS05 0216 CE36 ^10 MOS05 0195 CE1B [ MOS125 = &FF MOS05 0216 CE36 ^10 MOS05 0202 CE1B | MOS05 0216 CE36 ^10 MOS05 0203 CE1B B0 0A BCS SSCRUC ;(c unchanged since just after SSCRUA) MOS05 0216 CE36 ^10 MOS05 0204 CE1D 20 B1 CA SSCRUB JSR ADDROW ;Get next line down MOS05 0216 CE36 ^10 MOS05 0205 CE20 30 05 BMI SSCRUC ;Wraparound ?, then scroll slowly to be safe MOS05 0216 CE36 ^10 MOS05 0206 CE22 20 38 CE JSR XMIT ;No?, then we can scroll fast MOS05 0216 CE36 ^10 MOS05 0207 CE25 F0 03 BEQ SSCRUD ;xmit returns EQ MOS05 0216 CE36 ^10 MOS05 0208 CE27 20 73 CE SSCRUC JSR SSCRS ;Scroll slowly MOS05 0216 CE36 ^10 MOS05 0209 CE2A ] MOS05 0216 CE36 ^10 MOS05 0210 CE2A A5 DC SSCRUD LDA ZTEMPB ;Load next receive address MOS05 0216 CE36 ^10 MOS05 0211 CE2C A6 DA LDX ZTEMP MOS05 0216 CE36 ^10 MOS05 0212 CE2E 85 D9 STA ZMEMT +&01 ;and store it MOS05 0216 CE36 ^10 MOS05 0213 CE30 86 D8 STX ZMEMT MOS05 0216 CE36 ^10 MOS05 0214 CE32 C6 DE DEC ZTEMPC ;any more lines to copy ? MOS05 0216 CE36 ^10 MOS05 0215 CE34 D0 D6 BNE SSCRUA ;don't bother with the last line MOS05 0216 CE36 ^10 MOS05 0216 CE36 F0 90 BEQ SSCREX ; Jump always -- MOS05 0217 CE38 -- MOS05 0218 CE38 ;XMIT - Fast soft scroll -- MOS05 0219 CE38 ;Copy PWWDTH bytes from (ZTEMP) to (ZMEMT) -- MOS05 0220 CE38 -- MOS05 0221 CE38 AE 4D 03 XMIT LDX PWWDTH +&01 ;How many pages? -- MOS05 0222 CE3B F0 10 BEQ XMITB ;None?, then attempt fractional MOS05 0222 CE3B v6F MOS05 0223 CE3D A0 00 LDYIM &00 MOS05 0222 CE3B v6F MOS05 0224 CE3F B1 DA XMITA LDAIY ZTEMP ;Inner loop - copy complete page MOS05 0222 CE3B v6F MOS05 0225 CE41 91 D8 STAIY ZMEMT MOS05 0222 CE3B v6F MOS05 0226 CE43 C8 INY MOS05 0222 CE3B v6F MOS05 0227 CE44 D0 F9 BNE XMITA MOS05 0222 CE3B v6F MOS05 0228 CE46 E6 D9 INC ZMEMT +&01 ;Prepare to copy next page MOS05 0222 CE3B v6F MOS05 0229 CE48 E6 DB INC ZTEMP +&01 MOS05 0222 CE3B v6F MOS05 0230 CE4A CA DEX ;Any more complete pages to copy ? MOS05 0222 CE3B v6F MOS05 0231 CE4B D0 F2 BNE XMITA MOS05 0222 CE3B v6F MOS05 0232 CE4D AC 4C 03 XMITB LDY PWWDTH ;Copy fractional page? -- MOS05 0233 CE50 F0 08 BEQ XMITD ;No?, then exit MOS05 0233 CE50 v77 MOS05 0234 CE52 88 XMITC DEY MOS05 0233 CE50 v77 MOS05 0235 CE53 B1 DA LDAIY ZTEMP ;Yes?, then do so MOS05 0233 CE50 v77 MOS05 0236 CE55 91 D8 STAIY ZMEMT MOS05 0233 CE50 v77 MOS05 0237 CE57 98 TYA MOS05 0233 CE50 v77 MOS05 0238 CE58 D0 F8 BNE XMITC MOS05 0233 CE50 v77 MOS05 0239 CE5A 60 XMITD RTS ;Referenced below -- MOS05 0240 CE5B -- MOS05 0241 CE5B ;SSCRIN Soft scroll initialisation -- MOS05 0242 CE5B -- MOS05 0243 CE5B ;(SSWS) := (CSX)(CSY) -- MOS05 0244 CE5B ;(CSX) := (TWLCOL) -- MOS05 0245 CE5B ;(ZTEMPC) := No. of rows to scroll, minus one -- MOS05 0246 CE5B -- MOS05 0247 CE5B 20 C8 CD SSCRIN JSR SSCREX ;Store current text cursor for future reference -- MOS05 0248 CE5E 38 SEC ;Determine no. of rows to scroll -- MOS05 0249 CE5F AD 09 03 LDA TWBROW ;i.e. no. rows in window minus 1 -- MOS05 0250 CE62 ED 0B 03 SBC TWTROW -- MOS05 0251 CE65 85 DE STA ZTEMPC -- MOS05 0252 CE67 D0 05 BNE SSCRIM MOS05 0252 CE67 v7A MOS05 0253 CE69 68 PLA ;If zero lines to scroll, then cheat stack MOS05 0252 CE67 v7A MOS05 0254 CE6A 68 PLA MOS05 0252 CE67 v7A MOS05 0255 CE6B 4C C8 CD JMP SSCREX ;& restore cursor MOS05 0252 CE67 v7A MOS05 0256 CE6E MOS05 0252 CE67 v7A MOS05 0257 CE6E AD 08 03 SSCRIM LDA TWLCOL ;Put x cursor on LH margin -- MOS05 0258 CE71 10 70 BPL CLTLND MOS05 0258 CE71 v0F MOS05 0259 CE73 MOS05 0258 CE71 v0F MOS05 0260 CE73 MOS05 0258 CE71 v0F MOS05 0261 CE73 ;SSCRS Slow soft scroll MOS05 0258 CE71 v0F MOS05 0262 CE73 ;Scrolls 1 row of characters, one by one from (ZTEMP) to (ZMEMT), MOS05 0258 CE71 v0F MOS05 0263 CE73 ;preserving the LSB of ZTEMP. MOS05 0258 CE71 v0F MOS05 0264 CE73 ;Requires that ZMEMT & ZTEMP be juxtaposed. MOS05 0258 CE71 v0F MOS05 0265 CE73 ;Checks for wraparound after each character is copied MOS05 0258 CE71 v0F MOS05 0266 CE73 MOS05 0258 CE71 v0F MOS05 0267 CE73 A5 DA SSCRS LDA ZTEMP ;Push LSB of ZTEMP MOS05 0258 CE71 v0F MOS05 0268 CE75 48 PHA MOS05 0258 CE71 v0F MOS05 0269 CE76 38 SEC ;Calc no. chars to copy -1 MOS05 0258 CE71 v0F MOS05 0270 CE77 AD 0A 03 LDA TWRCOL MOS05 0258 CE71 v0F MOS05 0271 CE7A ED 08 03 SBC TWLCOL MOS05 0258 CE71 v0F MOS05 0272 CE7D 85 DF STA ZTEMPC +&01 ;No. of columns to be scrolled (for loop) MOS05 0258 CE71 v0F MOS05 0273 CE7F AC 4F 03 SSCRSA LDY BYTCH MOS05 0258 CE71 v0F MOS05 0274 CE82 88 DEY MOS05 0258 CE71 v0F MOS05 0275 CE83 B1 DA SSCRSB LDAIY ZTEMP ;~~~ Copy 1 character ~~~ MOS05 0258 CE71 v0F MOS05 0276 CE85 91 D8 STAIY ZMEMT ;by copying (BYTCH) consecutive bytes MOS05 0258 CE71 v0F MOS05 0277 CE87 88 DEY MOS05 0258 CE71 v0F MOS05 0278 CE88 10 F9 BPL SSCRSB MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 25 MOS05 VDU File - MOS05 MOS05 MOS05 0258 CE71 v0F MOS05 0279 CE8A A2 02 LDXIM &02 ;Now add BYTCH to ZMEMT & ZTEMP, MOS05 0258 CE71 v0F MOS05 0280 CE8C 18 SSCRSC CLC ;checking for wraparound on both MOS05 0258 CE71 v0F MOS05 0281 CE8D B5 D8 LDAZX ZMEMT ;uses ZX mode, hence need for ZMEMT to be next to ZTEMP MOS05 0258 CE71 v0F MOS05 0282 CE8F 6D 4F 03 ADC BYTCH MOS05 0258 CE71 v0F MOS05 0283 CE92 95 D8 STAZX ZMEMT MOS05 0258 CE71 v0F MOS05 0284 CE94 B5 D9 LDAZX ZMEMT +&01 MOS05 0258 CE71 v0F MOS05 0285 CE96 69 00 ADCIM &00 MOS05 0258 CE71 v0F MOS05 0286 CE98 10 04 BPL SSCRSD ;Did wraparound occur? MOS05 0258 CE71 v0F MOS05 0287 CE9A 38 SEC MOS05 0258 CE71 v0F MOS05 0288 CE9B ED 54 03 SBC BYTSCN MOS05 0258 CE71 v0F MOS05 0289 CE9E 95 D9 SSCRSD STAZX ZMEMT +&01 MOS05 0258 CE71 v0F MOS05 0290 CEA0 CA DEX MOS05 0258 CE71 v0F MOS05 0291 CEA1 CA DEX MOS05 0258 CE71 v0F MOS05 0292 CEA2 F0 E8 BEQ SSCRSC ;(Do ZMEMT) MOS05 0258 CE71 v0F MOS05 0293 CEA4 C6 DF DEC ZTEMPC +&01 ;Any more characters? MOS05 0258 CE71 v0F MOS05 0294 CEA6 10 D7 BPL SSCRSA MOS05 0258 CE71 v0F MOS05 0295 CEA8 68 PLA ;Restore LSB of ZMEMT MOS05 0258 CE71 v0F MOS05 0296 CEA9 85 DA STA ZTEMP MOS05 0258 CE71 v0F MOS05 0297 CEAB 60 RTS MOS05 0258 CE71 v0F MOS05 0298 CEAC MOS05 0258 CE71 v0F MOS05 0299 CEAC ;Clear the line of text addressed by CSY MOS05 0258 CE71 v0F MOS05 0300 CEAC ;Preserve CSY & CSX MOS05 0258 CE71 v0F MOS05 0301 CEAC MOS05 0258 CE71 v0F MOS05 0302 CEAC AD 18 03 CLTLIN LDA CSX ;Push the current X cursor position MOS05 0258 CE71 v0F MOS05 0303 CEAF 48 PHA MOS05 0258 CE71 v0F MOS05 0304 CEB0 20 6E CE JSR SSCRIM ;CSX = Left margin of window MOS05 0258 CE71 v0F MOS05 0305 CEB3 20 09 CF JSR TADDRY ;Init. ZMEMT MOS05 0258 CE71 v0F MOS05 0306 CEB6 38 SEC MOS05 0258 CE71 v0F MOS05 0307 CEB7 AD 0A 03 LDA TWRCOL MOS05 0258 CE71 v0F MOS05 0308 CEBA ED 08 03 SBC TWLCOL MOS05 0258 CE71 v0F MOS05 0309 CEBD 85 DC STA ZTEMPB ;Column count MOS05 0258 CE71 v0F MOS05 0310 CEBF AD 58 03 CLTLNA LDA BTCOLF ;get colour MOS05 0258 CE71 v0F MOS05 0311 CEC2 AC 4F 03 LDY BYTCH ;Bytes / character MOS05 0258 CE71 v0F MOS05 0312 CEC5 88 CLTNB DEY ;Inner loop - clear one character cell MOS05 0258 CE71 v0F MOS05 0313 CEC6 91 D8 STAIY ZMEMT ;(preserves z from previous DEY) MOS05 0258 CE71 v0F MOS05 0314 CEC8 D0 FB BNE CLTNB ;1 char cell MOS05 0258 CE71 v0F MOS05 0315 CECA 8A TXA ;Update ZMEMT MOS05 0258 CE71 v0F MOS05 0316 CECB 18 CLC MOS05 0258 CE71 v0F MOS05 0317 CECC 6D 4F 03 ADC BYTCH MOS05 0258 CE71 v0F MOS05 0318 CECF AA TAX MOS05 0258 CE71 v0F MOS05 0319 CED0 A5 D9 LDA ZMEMT +&01 MOS05 0258 CE71 v0F MOS05 0320 CED2 69 00 ADCIM &00 MOS05 0258 CE71 v0F MOS05 0321 CED4 10 04 BPL CLNLC ;Wraparound ? MOS05 0258 CE71 v0F MOS05 0322 CED6 38 SEC ;Yes, then subtract off the number of bytes per screen MOS05 0258 CE71 v0F MOS05 0323 CED7 ED 54 03 SBC BYTSCN MOS05 0258 CE71 v0F MOS05 0324 CEDA 86 D8 CLNLC STX ZMEMT MOS05 0258 CE71 v0F MOS05 0325 CEDC 85 D9 STA ZMEMT +&01 MOS05 0258 CE71 v0F MOS05 0326 CEDE C6 DC DEC ZTEMPB ;One less character to clear MOS05 0258 CE71 v0F MOS05 0327 CEE0 10 DD BPL CLTLNA ;Any more? MOS05 0258 CE71 v0F MOS05 0328 CEE2 68 PLA MOS05 0258 CE71 v0F MOS05 0329 CEE3 8D 18 03 CLTLND STA CSX -- MOS05 0330 CEE6 38 FAIL SEC MOS05 0368 CF07 ^5D MOS05 0331 CEE7 60 RTS MOS05 0368 CF07 ^5D MOS05 0332 CEE8 MOS05 0368 CF07 ^5D MOS05 0333 CEE8 MOS05 0368 CF07 ^5D MOS05 0334 CEE8 ;Addresses CSX,CSY to memory locn. on screen. MOS05 0368 CF07 ^5D MOS05 0335 CEE8 ;Checks that CSX & CSY are in window MOS05 0368 CF07 ^5D MOS05 0336 CEE8 ;Returns with no action and c=1 if outside. MOS05 0368 CF07 ^5D MOS05 0337 CEE8 ;If OK, initialises ZMEMT and CSPOSN MOS05 0368 CF07 ^5D MOS05 0338 CEE8 ;Exits with cursor address in (AX) MOS05 0368 CF07 ^5D MOS05 0339 CEE8 ;For cursor display, follow immediately with MOS05 0368 CF07 ^5D MOS05 0340 CEE8 ;JSR CSDSP MOS05 0368 CF07 ^5D MOS05 0341 CEE8 MOS05 0368 CF07 ^5D MOS05 0342 CEE8 [ MOS125 = &FF MOS05 0368 CF07 ^5D MOS05 0355 CEE8 | MOS05 0368 CF07 ^5D MOS05 0356 CEE8 8D 19 03 SYTADD STA CSY MOS05 0368 CF07 ^5D MOS05 0357 CEEB AE 18 03 TADDR LDX CSX ;Check window of CSX MOS05 0368 CF07 ^5D MOS05 0358 CEEE EC 08 03 CPX TWLCOL ;Lower than LH margin ? MOS05 0368 CF07 ^5D MOS05 0359 CEF1 90 F3 BCC FAIL MOS05 0368 CF07 ^5D MOS05 0360 CEF3 EC 0A 03 CPX TWRCOL ;Higher than RH edge ? MOS05 0368 CF07 ^5D MOS05 0361 CEF6 F0 02 BEQ TADDRX MOS05 0368 CF07 ^5D MOS05 0362 CEF8 B0 EC BCS FAIL MOS05 0368 CF07 ^5D MOS05 0363 CEFA AE 19 03 TADDRX LDX CSY ;Check CSY MOS05 0368 CF07 ^5D MOS05 0364 CEFD EC 0B 03 CPX TWTROW MOS05 0368 CF07 ^5D MOS05 0365 CF00 90 E4 BCC FAIL MOS05 0368 CF07 ^5D MOS05 0366 CF02 EC 09 03 CPX TWBROW MOS05 0368 CF07 ^5D MOS05 0367 CF05 F0 02 BEQ TADDRY MOS05 0368 CF07 ^5D MOS05 0368 CF07 B0 DD BCS FAIL MOS05 0367 CF05 v7D MOS05 0369 CF09 ] MOS05 0367 CF05 v7D MOS05 0370 CF09 MOS05 0367 CF05 v7D MOS05 0371 CF09 ;End of windowing, now calc. memory posn. MOS05 0367 CF05 v7D MOS05 0372 CF09 ;As TADDR with no bounds checking MOS05 0367 CF05 v7D MOS05 0373 CF09 ;Returns carry clear MOS05 0367 CF05 v7D MOS05 0374 CF09 MOS05 0367 CF05 v7D MOS05 0375 CF09 AD 19 03 TADDRY LDA CSY ;Twice row no. to Y -- MOS05 0376 CF0C 0A ASLA -- MOS05 0377 CF0D A8 TAY ;(c=0 at this point) -- MOS05 0378 CF0E B1 E0 LDAIY ZTBL ;MSB -- MOS05 0379 CF10 85 D9 STA ZMEMT+&01 -- MOS05 0380 CF12 C8 INY -- MOS05 0381 CF13 A9 02 LDAIM &02 -- MOS05 0382 CF15 2D 56 03 AND MEMODE ;Non-zero if table offset is to be halved -- MOS05 0383 CF18 08 PHP -- MOS05 0384 CF19 B1 E0 LDAIY ZTBL ;LSB -- MOS05 0385 CF1B 28 PLP -- MOS05 0386 CF1C F0 03 BEQ TADDRH MOS05 0386 CF1C v7C MOS05 0387 CF1E 46 D9 LSR ZMEMT+&01 MOS05 0386 CF1C v7C MOS05 0388 CF20 6A RORA MOS05 0386 CF1C v7C MOS05 0389 CF21 6D 50 03 TADDRH ADC TOPSCN ;c=0 Add LSB -- MOS05 0390 CF24 85 D8 STA ZMEMT -- MOS05 0391 CF26 A5 D9 LDA ZMEMT+&01 ;Add MSB -- MOS05 0392 CF28 6D 51 03 ADC TOPSCN+&01 -- MOS05 0393 CF2B A8 TAY ;Xfr MSB to Y -- MOS05 0394 CF2C ;Mpy. CSX by BYTCH -- MOS05 0395 CF2C AD 18 03 LDA CSX -- MOS05 0396 CF2F AE 4F 03 LDX BYTCH ;Is it TTX ? -- MOS05 0397 CF32 CA DEX -- MOS05 0398 CF33 F0 12 BEQ TADDRE ;Skip mult. if TTX MOS05 0398 CF33 v6D MOS05 0399 CF35 E0 0F CPXIM &0F ;4 colour (16 bytes) ? MOS05 0398 CF33 v6D MOS05 0400 CF37 F0 03 BEQ TADDRF MOS05 0398 CF33 v6D MOS05 0401 CF39 90 02 BCC TADDRG ;Less ? Then 2 colour MOS05 0398 CF33 v6D MOS05 0402 CF3B 0A ASLA ;Must have been 16 colour MOS05 0398 CF33 v6D MOS05 0403 CF3C 0A TADDRF ASLA ;4 colour MOS05 0398 CF33 v6D MOS05 0404 CF3D 0A TADDRG ASLA ;2 colour MOS05 0398 CF33 v6D MOS05 0405 CF3E 0A ASLA MOS05 0398 CF33 v6D MOS05 0406 CF3F 90 02 BCC TADDRB MOS05 0398 CF33 v6D MOS05 0407 CF41 C8 INY ;c=1?, then inc. MSB by 2 MOS05 0398 CF33 v6D MOS05 0408 CF42 C8 INY MOS05 0398 CF33 v6D MOS05 0409 CF43 0A TADDRB ASLA MOS05 0398 CF33 v6D MOS05 0410 CF44 90 02 BCC TADDRC MOS05 0398 CF33 v6D MOS05 0411 CF46 C8 INY ;c=1, then inc. MSB by 1 MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 26 MOS05 VDU File - MOS05 MOS05 MOS05 0398 CF33 v6D MOS05 0412 CF47 18 TADDRE CLC MOS05 0410 CF44 v7D MOS05 0413 CF48 65 D8 TADDRC ADC ZMEMT ;(c=0), add LSB of row offset -- MOS05 0414 CF4A 85 D8 STA ZMEMT -- MOS05 0415 CF4C 8D 4A 03 STA CSPOSN -- MOS05 0416 CF4F AA TAX ;LSB is returned by this routine in X -- MOS05 0417 CF50 98 TYA ;MSB to A -- MOS05 0418 CF51 69 00 ADCIM &00 -- MOS05 0419 CF53 8D 4B 03 STA CSPOSN +&01 ;Store to cursor before wraparound -- MOS05 0420 CF56 10 04 BPL TADDRD ;Wraparound ? MOS05 0420 CF56 v7B MOS05 0421 CF58 38 SEC ;Yes, then subt. scn. MOS05 0420 CF56 v7B MOS05 0422 CF59 ED 54 03 SBC BYTSCN MOS05 0420 CF56 v7B MOS05 0423 CF5C 85 D9 TADDRD STA ZMEMT +&01 ;Store physical address to ZMEMT -- MOS05 0424 CF5E 18 CLC ;indicate successful addressing -- MOS05 0425 CF5F 60 RTS -- MOS05 0426 CF60 -- MOS05 0427 CF60 ;PRINT CHARACTER TO VDU -- MOS05 0428 CF60 -- MOS05 0429 CF60 -- MOS05 0430 CF60 -- MOS05 0431 CF60 -- MOS05 0432 CF60 ;ANOMALOUS PRINTING -- MOS05 0433 CF60 -- MOS05 0434 CF60 AE 59 03 PRANM LDX FGCOLF ;Printing to be in foreground graphics colour MOS05 0507 CFB6 ^28 MOS05 0435 CF63 AC 5B 03 LDY GPLFMD ;In the current foreground colour mode MOS05 0507 CFB6 ^28 MOS05 0436 CF66 20 C5 D0 PRANC JSR SETZG ;Initialise ZGORA & ZGEOR MOS05 0543 CFD6 ^0E MOS05 0437 CF69 MOS05 0543 CFD6 ^0E MOS05 0438 CF69 ;The graphics cursor is copied to 2 locations, APCS1 MOS05 0543 CFD6 ^0E MOS05 0439 CF69 ;and APCS2 . The latter is left untouched until the end of the printing, MOS05 0543 CFD6 ^0E MOS05 0440 CF69 ;when it is restored to the GCSIY. The former is copied to the GCSIY MOS05 0543 CFD6 ^0E MOS05 0441 CF69 ;after every column of pixels is printed, with the X cursor incremented MOS05 0543 CFD6 ^0E MOS05 0442 CF69 ;each time. MOS05 0543 CFD6 ^0E MOS05 0443 CF69 MOS05 0543 CFD6 ^0E MOS05 0444 CF69 20 3D D4 JSR COPYFA ;Copy GCSIY to APCS2 ... MOS05 0543 CFD6 ^0E MOS05 0445 CF6C A0 00 LDYIM &00 ;Initialise row counter MOS05 0543 CFD6 ^0E MOS05 0446 CF6E 84 DC PRANMC STY ZTEMPB MOS05 0543 CFD6 ^0E MOS05 0447 CF70 [ MOS125 = &FF MOS05 0543 CFD6 ^0E MOS05 0449 CF70 ] MOS05 0543 CFD6 ^0E MOS05 0450 CF70 B1 DE LDAIY ZTEMPC ;Anything to do ? MOS05 0543 CFD6 ^0E MOS05 0451 CF72 F0 13 BEQ PRANMG ;No, then skip MOS05 0543 CFD6 ^0E MOS05 0452 CF74 85 DD STA ZTEMPB +&01 MOS05 0543 CFD6 ^0E MOS05 0453 CF76 10 03 PRANMA BPL PRANMD MOS05 0543 CFD6 ^0E MOS05 0454 CF78 20 F5 D0 JSR WPLOTA ;Yes, then plot if inside window MOS05 0543 CFD6 ^0E MOS05 0455 CF7B EE 24 03 PRANMD INC GCSIX ;Increment X cursor MOS05 0543 CFD6 ^0E MOS05 0456 CF7E D0 03 BNE PRANME MOS05 0543 CFD6 ^0E MOS05 0457 CF80 EE 25 03 INC GCSIX +&01 MOS05 0543 CFD6 ^0E MOS05 0458 CF83 06 DD PRANME ASL ZTEMPB +&01 MOS05 0543 CFD6 ^0E MOS05 0459 CF85 D0 EF BNE PRANMA MOS05 0543 CFD6 ^0E MOS05 0460 CF87 A2 28 PRANMG LDXIM APCS1-V ;Restore previous x cursor MOS05 0543 CFD6 ^0E MOS05 0461 CF89 A0 24 LDYIM GCSIR-V MOS05 0543 CFD6 ^0E MOS05 0462 CF8B 20 39 D4 JSR COPY2 MOS05 0543 CFD6 ^0E MOS05 0463 CF8E AC 26 03 LDY GCSIY ;Decrement Igraphics Y cursor MOS05 0543 CFD6 ^0E MOS05 0464 CF91 D0 03 BNE PRANMF MOS05 0543 CFD6 ^0E MOS05 0465 CF93 CE 27 03 DEC GCSIY +&01 MOS05 0543 CFD6 ^0E MOS05 0466 CF96 CE 26 03 PRANMF DEC GCSIY MOS05 0543 CFD6 ^0E MOS05 0467 CF99 A4 DC LDY ZTEMPB ;Do next row MOS05 0543 CFD6 ^0E MOS05 0468 CF9B C8 INY MOS05 0543 CFD6 ^0E MOS05 0469 CF9C C0 08 CPYIM &08 MOS05 0543 CFD6 ^0E MOS05 0470 CF9E D0 CE BNE PRANMC MOS05 0543 CFD6 ^0E MOS05 0471 CFA0 A2 28 LDXIM APCS1 ;Finished, so restore grpahics cursor MOS05 0543 CFD6 ^0E MOS05 0472 CFA2 A0 24 LDYIM GCSIR-V MOS05 0543 CFD6 ^0E MOS05 0473 CFA4 4C 41 D4 JMP COPYF ; (branch always taken) MOS05 0543 CFD6 ^0E MOS05 0474 CFA7 MOS05 0543 CFD6 ^0E MOS05 0475 CFA7 [ MOS125 = &FF MOS05 0543 CFD6 ^0E MOS05 0491 CFA7 ] MOS05 0543 CFD6 ^0E MOS05 0492 CFA7 MOS05 0543 CFD6 ^0E MOS05 0493 CFA7 ;NON-ANOMALOUS MOS05 0543 CFD6 ^0E MOS05 0494 CFA7 MOS05 0543 CFD6 ^0E MOS05 0495 CFA7 ;Character to be printed in (A) MOS05 0543 CFD6 ^0E MOS05 0496 CFA7 MOS05 0543 CFD6 ^0E MOS05 0497 CFA7 ;Set up address of bytes to be MOS05 0543 CFD6 ^0E MOS05 0498 CFA7 ;copied from soft font. Result MOS05 0543 CFD6 ^0E MOS05 0499 CFA7 ;to ZTEMP MOS05 0543 CFD6 ^0E MOS05 0500 CFA7 MOS05 0543 CFD6 ^0E MOS05 0501 CFA7 AE 60 03 VDUPR LDX NCOLOR ;TTX? MOS05 0543 CFD6 ^0E MOS05 0502 CFAA F0 43 BEQ PTTX MOS05 0543 CFD6 ^0E MOS05 0503 CFAC 20 50 D0 JSR CHADDR ;Point (ZTEMPC) to character in soft font MOS05 0543 CFD6 ^0E MOS05 0504 CFAF AE 60 03 VDUPRB LDX NCOLOR ;Because CHADDR now destroys (X) MOS05 0543 CFD6 ^0E MOS05 0505 CFB2 A5 D0 LDA STATS ;Is this anomalous printing ? MOS05 0543 CFD6 ^0E MOS05 0506 CFB4 29 20 ANDIM &20 MOS05 0543 CFD6 ^0E MOS05 0507 CFB6 D0 A8 BNE PRANM ;Anom. printing MOS05 0543 CFD6 ^0E MOS05 0508 CFB8 MOS05 0543 CFD6 ^0E MOS05 0509 CFB8 ;Now select the mode MOS05 0543 CFD6 ^0E MOS05 0510 CFB8 MOS05 0543 CFD6 ^0E MOS05 0511 CFB8 A0 07 LDYIM &07 ;No. rows (except TTX) MOS05 0543 CFD6 ^0E MOS05 0512 CFBA E0 03 CPXIM &03 MOS05 0543 CFD6 ^0E MOS05 0513 CFBC F0 45 BEQ PFOUR ;4 colour mode ? MOS05 0543 CFD6 ^0E MOS05 0514 CFBE B0 71 BCS PSXTN ;16 colour mode ? MOS05 0514 CFBE v0E MOS05 0515 CFC0 MOS05 0514 CFBE v0E MOS05 0516 CFC0 ;TWO colour mode MOS05 0514 CFBE v0E MOS05 0517 CFC0 MOS05 0514 CFBE v0E MOS05 0518 CFC0 B1 DE PTWO LDAIY ZTEMPC MOS05 0514 CFBE v0E MOS05 0519 CFC2 05 D2 ORA ZORA MOS05 0514 CFBE v0E MOS05 0520 CFC4 45 D3 EOR ZEOR MOS05 0514 CFBE v0E MOS05 0521 CFC6 91 D8 STAIY ZMEMT MOS05 0514 CFBE v0E MOS05 0522 CFC8 88 DEY MOS05 0514 CFBE v0E MOS05 0523 CFC9 10 F5 BPL PTWO MOS05 0514 CFBE v0E MOS05 0524 CFCB 60 RTS MOS05 0514 CFBE v0E MOS05 0525 CFCC MOS05 0514 CFBE v0E MOS05 0526 CFCC ;TELETEXT mode MOS05 0514 CFBE v0E MOS05 0527 CFCC MOS05 0514 CFBE v0E MOS05 0528 CFCC [ MOS125 = &FF MOS05 0514 CFBE v0E MOS05 0538 CFCC | MOS05 0514 CFBE v0E MOS05 0539 CFCC A9 7F DELA LDAIM &7F ;Point to DEL, only unprintable char. in hard font =$FF...$FF MOS05 0514 CFBE v0E MOS05 0540 CFCE 20 50 D0 JSR CHADDR MOS05 0514 CFBE v0E MOS05 0541 CFD1 AE 5A 03 LDX BGCOLF ;Force this to be graphics background colour MOS05 0514 CFBE v0E MOS05 0542 CFD4 A0 00 LDYIM &00 ;Mode is STORE MOS05 0514 CFBE v0E MOS05 0543 CFD6 F0 8E BEQ PRANC MOS05 0514 CFBE v0E MOS05 0544 CFD8 MOS05 0514 CFBE v0E MOS05 0545 CFD8 ;DEL ($7F) Delete previous char MOS05 0514 CFBE v0E MOS05 0546 CFD8 MOS05 0514 CFBE v0E MOS05 0547 CFD8 20 C4 C5 DEL JSR BS ;Move back 1 character MOS05 0514 CFBE v0E MOS05 0548 CFDB 20 87 C5 JSR ANOMQ MOS05 0514 CFBE v0E MOS05 0549 CFDE D0 EC BNE DELA MOS05 0514 CFBE v0E MOS05 0550 CFE0 AE 60 03 LDX NCOLOR MOS05 0514 CFBE v0E MOS05 0551 CFE3 F0 08 BEQ PTTXSP ;TTX space MOS05 0514 CFBE v0E MOS05 0552 CFE5 85 DE STA ZTEMPC ;(A)=0 from ANOMQ MOS05 0514 CFBE v0E MOS05 0553 CFE7 A9 C0 LDAIM HFMSB +&01 ;Point to hard font version of space MOS05 0514 CFBE v0E MOS05 0554 CFE9 85 DF STA ZTEMPC +&01 MOS05 0514 CFBE v0E MOS05 0555 CFEB D0 C2 BNE VDUPRB ;always branch MOS05 0514 CFBE v0E MOS05 0556 CFED MOS05 0514 CFBE v0E MOS05 0557 CFED A9 20 PTTXSP LDAIM &20 ;Print TTX space MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 27 MOS05 VDU File - MOS05 MOS05 MOS05 0514 CFBE v0E MOS05 0558 CFEF 18 PTTX CLC ;write to screen MOS05 0514 CFBE v0E MOS05 0559 CFF0 TTXFRM ;transform once for ASCII->Teletext, twice for Teletext->ASCII MOS05 0514 CFBE v0E MOS05 0560 CFF0 49 23 EORIM &23 ;is character ASCII &23, hash? MOS05 0514 CFBE v0E MOS05 0561 CFF2 F0 04 BEQ PTTX5F ;then replace with Teletext &5F MOS05 0514 CFBE v0E MOS05 0562 CFF4 49 7C PTTX23 EORIM &23:EOR:&5F ;else is it ASCII &5F, underscore? MOS05 0514 CFBE v0E MOS05 0563 CFF6 F0 04 BEQ PTTX60 ;then replace with Teletext &60 MOS05 0514 CFBE v0E MOS05 0564 CFF8 49 3F PTTX5F EORIM &5F:EOR:&60 ;else is it ASCII &60, sterling? MOS05 0514 CFBE v0E MOS05 0565 CFFA F0 F8 BEQ PTTX23 ;then replace with Teletext &23 (won't loop!) MOS05 0514 CFBE v0E MOS05 0566 CFFC 49 60 PTTX60 EORIM &60 ;else undo our fiddling MOS05 0514 CFBE v0E MOS05 0567 CFFE B0 02 BCS PTTXC ;if C=1 then transform only else C=0, write to screen MOS05 0514 CFBE v0E MOS05 0568 D000 81 D8 STAIX ZMEMT ;as (X)=0 MOS05 0514 CFBE v0E MOS05 0569 D002 PTTXC MOS05 0514 CFBE v0E MOS05 0570 D002 60 RTS MOS05 0514 CFBE v0E MOS05 0571 D003 ] MOS05 0514 CFBE v0E MOS05 0572 D003 MOS05 0514 CFBE v0E MOS05 0573 D003 ;FOUR colour mode MOS05 0514 CFBE v0E MOS05 0574 D003 MOS05 0514 CFBE v0E MOS05 0575 D003 B1 DE PFOUR LDAIY ZTEMPC ;Get bit pattern MOS05 0514 CFBE v0E MOS05 0576 D005 48 PHA ;Push for L.S.Nybble MOS05 0514 CFBE v0E MOS05 0577 D006 4A LSRA MOS05 0514 CFBE v0E MOS05 0578 D007 4A LSRA MOS05 0514 CFBE v0E MOS05 0579 D008 4A LSRA MOS05 0514 CFBE v0E MOS05 0580 D009 4A LSRA MOS05 0514 CFBE v0E MOS05 0581 D00A AA TAX MOS05 0514 CFBE v0E MOS05 0582 D00B BD 1F C3 LDAAX BPFTB ;Get expanded patten MOS05 0514 CFBE v0E MOS05 0583 D00E 05 D2 ORA ZORA ;of M.S.Nybble MOS05 0514 CFBE v0E MOS05 0584 D010 45 D3 EOR ZEOR MOS05 0514 CFBE v0E MOS05 0585 D012 91 D8 STAIY ZMEMT MOS05 0514 CFBE v0E MOS05 0586 D014 [ MOS125 = &FF MOS05 0514 CFBE v0E MOS05 0594 D014 | MOS05 0514 CFBE v0E MOS05 0595 D014 ; same size, reduce stack load MOS05 0514 CFBE v0E MOS05 0596 D014 68 PLA ;Get L.S.Nybble MOS05 0514 CFBE v0E MOS05 0597 D015 29 0F ANDIM &0F MOS05 0514 CFBE v0E MOS05 0598 D017 AA TAX MOS05 0514 CFBE v0E MOS05 0599 D018 98 TYA MOS05 0514 CFBE v0E MOS05 0600 D019 18 CLC MOS05 0514 CFBE v0E MOS05 0601 D01A 69 08 ADCIM &08 ;Access next char. cell MOS05 0514 CFBE v0E MOS05 0602 D01C A8 TAY MOS05 0514 CFBE v0E MOS05 0603 D01D ] MOS05 0514 CFBE v0E MOS05 0604 D01D BD 1F C3 LDAAX BPFTB MOS05 0514 CFBE v0E MOS05 0605 D020 05 D2 ORA ZORA MOS05 0514 CFBE v0E MOS05 0606 D022 45 D3 EOR ZEOR MOS05 0514 CFBE v0E MOS05 0607 D024 91 D8 STAIY ZMEMT MOS05 0514 CFBE v0E MOS05 0608 D026 98 TYA MOS05 0514 CFBE v0E MOS05 0609 D027 E9 08 SBCIM &08 ;c=0, thus subt. 9 MOS05 0514 CFBE v0E MOS05 0610 D029 A8 TAY MOS05 0514 CFBE v0E MOS05 0611 D02A 10 D7 BPL PFOUR MOS05 0514 CFBE v0E MOS05 0612 D02C 60 PSXTC RTS ;Also used by PSXTN MOS05 0514 CFBE v0E MOS05 0613 D02D MOS05 0514 CFBE v0E MOS05 0614 D02D ;SIXTEEN colour mode MOS05 0514 CFBE v0E MOS05 0615 D02D MOS05 0514 CFBE v0E MOS05 0616 D02D [ MOS125 = &FF MOS05 0514 CFBE v0E MOS05 0641 D02D | MOS05 0514 CFBE v0E MOS05 0642 D02D PSXTB ;Ref.the 1st cell again MOS05 0514 CFBE v0E MOS05 0643 D02D F0 FD BEQ PSXTC ;Finished ? MOS05 0514 CFBE v0E MOS05 0644 D02F A8 TAY ;No, then carry on .. MOS05 0514 CFBE v0E MOS05 0645 D030 88 DEY MOS05 0514 CFBE v0E MOS05 0646 D031 MOS05 0514 CFBE v0E MOS05 0647 D031 B1 DE PSXTN LDAIY ZTEMPC ;Get bit pattern MOS05 0660 D047 ^64 MOS05 0648 D033 0A PSXTA ASLA MOS05 0664 D04E ^63 MOS05 0649 D034 2A ROLA MOS05 0664 D04E ^63 MOS05 0650 D035 85 DC STA ZTEMPB MOS05 0664 D04E ^63 MOS05 0651 D037 29 01 ANDIM &01 MOS05 0664 D04E ^63 MOS05 0652 D039 2A ROLA ;(A)=next 2 bits MOS05 0664 D04E ^63 MOS05 0653 D03A AA TAX ;Get expanded bit pattern MOS05 0664 D04E ^63 MOS05 0654 D03B BD 2F C3 LDAAX BPSTB MOS05 0664 D04E ^63 MOS05 0655 D03E 05 D2 ORA ZORA MOS05 0664 D04E ^63 MOS05 0656 D040 45 D3 EOR ZEOR MOS05 0664 D04E ^63 MOS05 0657 D042 91 D8 STAIY ZMEMT MOS05 0664 D04E ^63 MOS05 0658 D044 98 TYA ;Access next char. cell MOS05 0664 D04E ^63 MOS05 0659 D045 E9 17 SBCIM &17 ;c=0, subtract $18 MOS05 0664 D04E ^63 MOS05 0660 D047 B0 E4 BCS PSXTB MOS05 0664 D04E ^63 MOS05 0661 D049 29 1F ANDIM &1F ;c=0 before & after MOS05 0664 D04E ^63 MOS05 0662 D04B A8 TAY MOS05 0664 D04E ^63 MOS05 0663 D04C A5 DC LDA ZTEMPB MOS05 0664 D04E ^63 MOS05 0664 D04E 90 E3 BCC PSXTA ;(branch always taken) -- MOS05 0665 D050 ] -- MOS05 0666 D050 -- MOS05 0667 D050 ;Addresses character in soft font. -- MOS05 0668 D050 ;Takes (ascii) value in A, multiplies by 8, adds appropriate font address -- MOS05 0669 D050 ;(assumed to be on page boudary), and puts result to ZTEMPC. -- MOS05 0670 D050 ;This addresses top row of character, subsequent rows being in the -- MOS05 0671 D050 ;following 7 bytes. -- MOS05 0672 D050 -- MOS05 0673 D050 [ MOS125 = &FF -- MOS05 0693 D050 | -- MOS05 0694 D050 0A CHADDR ASLA ;ZTEMPC:=8*CHAR. + MSB of font -- MOS05 0695 D051 2A ROLA -- MOS05 0696 D052 2A ROLA -- MOS05 0697 D053 AA TAX -- MOS05 0698 D054 29 F8 ANDIM &F8 -- MOS05 0699 D056 85 DE STA ZTEMPC ;Store LSB of addr. -- MOS05 0700 D058 8A TXA -- MOS05 0701 D059 29 03 ANDIM &03 ;Get page number of character -- MOS05 0702 D05B 2A ROLA -- MOS05 0703 D05C AA TAX -- MOS05 0704 D05D 29 03 ANDIM &03 -- MOS05 0705 D05F 69 BF ADCIM HFMSB ;MSB of hard font - overwrite if soft font (c=0 from last ROLA) -- MOS05 0706 D061 A8 TAY -- MOS05 0707 D062 BD 0D C4 LDAAX BITTBL ;Which bit in the flag byte is to be tested -- MOS05 0708 D065 2C 67 03 BIT FNTFLG ;Test to see if soft or hard font -- MOS05 0709 D068 F0 03 BEQ CHADDS ;Clear, thus hard font MOS05 0709 D068 v7C MOS05 0710 D06A BC 67 03 LDYAX PGSFNT -&01 ;Load soft font page number MOS05 0709 D068 v7C MOS05 0711 D06D 84 DF CHADDS STY ZTEMPC +&01 ;Store MSByte -- MOS05 0712 D06F 60 RTS -- MOS05 0713 D070 ] -- MOS05 0714 D070 LNK MOS06 -- MOS06 0001 D070 -- MOS06 0002 D070 TTL VDU File - MOS06 -- MOS06 0003 D070 OPT MOS06 MOS06 MOS06 MOS06 MOS06 Acorn macro assembler Page 28 MOS06 VDU File - MOS06 MOS06 -- MOS06 0004 D070 -- MOS06 0005 D070 ;Last revision 15/05/82 -- MOS06 0006 D070 -- MOS06 0007 D070 ;15/06/82 Adjust bad plot mode indirection code -- MOS06 0008 D070 ;05/05/82 GADDR converted such that it takes only 1 table. -- MOS06 0009 D070 ; Moved to MOS11 -- MOS06 0010 D070 ;01/05/82 Recode to allow for new order of variables -- MOS06 0011 D070 ;21/04/82 Conditional assembly of start/end point double plotting. -- MOS06 0012 D070 ;22/01/82 Provide EIGABS -- MOS06 0013 D070 ;07/01/82 Put X to LSB of pointer -- MOS06 0014 D070 -- MOS06 0015 D070 ;******* PLOTTING ******* -- MOS06 0016 D070 -- MOS06 0017 D070 ;Prologue - converts from external to internal -- MOS06 0018 D070 ;co-ords, and distinguishes between types of -- MOS06 0019 D070 ;line & triangles -- MOS06 0020 D070 -- MOS06 0021 D070 A2 20 EMA LDXIM NEWPT-V ;Convert external to internal -- MOS06 0022 D072 [ MOS125 = &FF -- MOS06 0025 D072 | -- MOS06 0026 D072 AD 1F 03 LDA PLMODE ;Get plot mode -- MOS06 0027 D075 48 PHA -- MOS06 0028 D076 20 5D D1 JSR EIGC ;for the 4 bytes starting at Q -- MOS06 0029 D079 68 PLA -- MOS06 0030 D07A ] -- MOS06 0031 D07A C9 04 CMPIM &04 ;BASIC's MOVE command -- MOS06 0032 D07C F0 6D BEQ EMAEX MOS06 0032 D07C v12 MOS06 0033 D07E A0 05 LDYIM &05 ;Point to do damn' all mode (for plotting that produces no change) MOS06 0032 D07C v12 MOS06 0034 D080 29 03 ANDIM &03 MOS06 0032 D07C v12 MOS06 0035 D082 F0 0E BEQ EMAA ;No change, then exit MOS06 0032 D07C v12 MOS06 0036 D084 4A LSRA ;Is it odd ? MOS06 0032 D07C v12 MOS06 0037 D085 B0 03 BCS EMAF ;No?, then invert MOS06 0032 D07C v12 MOS06 0038 D087 88 DEY ;(Y) = 4. Point to INVERT values of table MOS06 0032 D07C v12 MOS06 0039 D088 D0 08 BNE EMAA ;(Branch always taken) MOS06 0032 D07C v12 MOS06 0040 D08A AA EMAF TAX MOS06 0032 D07C v12 MOS06 0041 D08B BC 5B 03 LDYAX GPLFMD MOS06 0032 D07C v12 MOS06 0042 D08E BD 59 03 LDAAX FGCOLF MOS06 0032 D07C v12 MOS06 0043 D091 AA TAX MOS06 0032 D07C v12 MOS06 0044 D092 20 C5 D0 EMAA JSR SETZG MOS06 0032 D07C v12 MOS06 0045 D095 MOS06 0032 D07C v12 MOS06 0046 D095 ;What's to be done ? MOS06 0032 D07C v12 MOS06 0047 D095 MOS06 0032 D07C v12 MOS06 0048 D095 AD 1F 03 LDA PLMODE ;Get plot mode MOS06 0032 D07C v12 MOS06 0049 D098 ;* TAY MOS06 0032 D07C v12 MOS06 0050 D098 30 23 BMI EXGREF ;Negative, then reference external routine MOS06 0032 D07C v12 MOS06 0051 D09A 0A ASLA ;Get type of operation MOS06 0032 D07C v12 MOS06 0052 D09B 10 3B BPL EMAD ;Is it a line? MOS06 0032 D07C v12 MOS06 0053 D09D 29 F0 ANDIM &F0 ;Get rid of irrelevant data MOS06 0032 D07C v12 MOS06 0054 D09F 0A ASLA ;Is it point ($80, will be shifted out) ? MOS06 0032 D07C v12 MOS06 0055 D0A0 F0 46 BEQ EMAC MOS06 0032 D07C v12 MOS06 0056 D0A2 49 40 EORIM &40 ;Triangles? MOS06 0032 D07C v12 MOS06 0057 D0A4 F0 14 BEQ EMAG MOS06 0032 D07C v12 MOS06 0058 D0A6 48 PHA MOS06 0032 D07C v12 MOS06 0059 D0A7 20 EE D0 JSR EMAEY ;Copy newpoint to internal cursor MOS06 0032 D07C v12 MOS06 0060 D0AA 68 PLA MOS06 0032 D07C v12 MOS06 0061 D0AB 49 60 EORIM &60 ;SPLOT MOS06 0032 D07C v12 MOS06 0062 D0AD F0 11 BEQ EME ;($60=$20 EOR $40) MOS06 0032 D07C v12 MOS06 0063 D0AF C9 40 CMPIM &40 ;SPLOT looking for b/g ($60 = $40 EOR $60 EOR $40) MOS06 0032 D07C v12 MOS06 0064 D0B1 D0 0A BNE EXGREF MOS06 0032 D07C v12 MOS06 0065 D0B3 A9 02 LDAIM &02 ;This is what is EORed with the flag register MOS06 0032 D07C v12 MOS06 0066 D0B5 85 DC STA ZTEMPB MOS06 0032 D07C v12 MOS06 0067 D0B7 4C BC D4 JMP SCHEAT MOS06 0032 D07C v12 MOS06 0068 D0BA MOS06 0032 D07C v12 MOS06 0069 D0BA 4C 9C D5 EMAG JMP EMC ;Jump to triangles MOS06 0032 D07C v12 MOS06 0070 D0BD EXGREF MOS06 0032 D07C v12 MOS06 0071 D0BD ;* TYA ;Restore plot mode to A MOS06 0032 D07C v12 MOS06 0072 D0BD 4C 0E C9 JMP JMIV25 MOS06 0032 D07C v12 MOS06 0073 D0C0 MOS06 0032 D07C v12 MOS06 0074 D0C0 85 DC EME STA ZTEMPB ;(A)=0 .This is what is EORed with the flag register MOS06 0032 D07C v12 MOS06 0075 D0C2 4C 75 D4 JMP SPLOT ;Fill plot MOS06 0032 D07C v12 MOS06 0076 D0C5 MOS06 0032 D07C v12 MOS06 0077 D0C5 ;Set up ZGORA & ZGEOR, using MOS06 0032 D07C v12 MOS06 0078 D0C5 ;(X)=Full colour byte MOS06 0032 D07C v12 MOS06 0079 D0C5 ;(Y)=Plot mode MOS06 0032 D07C v12 MOS06 0080 D0C5 MOS06 0032 D07C v12 MOS06 0081 D0C5 8A SETZG TXA MOS06 0032 D07C v12 MOS06 0082 D0C6 19 1C C4 ORAAY TBZGOO MOS06 0032 D07C v12 MOS06 0083 D0C9 59 1D C4 EORAY TBZGEO MOS06 0032 D07C v12 MOS06 0084 D0CC 85 D4 STA ZGORA MOS06 0032 D07C v12 MOS06 0085 D0CE 8A TXA MOS06 0032 D07C v12 MOS06 0086 D0CF 19 1B C4 ORAAY TBZGOE MOS06 0032 D07C v12 MOS06 0087 D0D2 59 20 C4 EORAY TBZGEE MOS06 0032 D07C v12 MOS06 0088 D0D5 85 D5 STA ZGEOR MOS06 0032 D07C v12 MOS06 0089 D0D7 60 RTS MOS06 0032 D07C v12 MOS06 0090 D0D8 MOS06 0032 D07C v12 MOS06 0091 D0D8 ;Plot a line or curve MOS06 0032 D07C v12 MOS06 0092 D0D8 MOS06 0032 D07C v12 MOS06 0093 D0D8 0A EMAD ASLA ;Is it a line or curve ? MOS06 0032 D07C v12 MOS06 0094 D0D9 30 E2 BMI EXGREF ;Curve, so reference user routine MOS06 0032 D07C v12 MOS06 0095 D0DB 0A ASLA MOS06 0032 D07C v12 MOS06 0096 D0DC 0A ASLA ;It's a line, so is the first point to be plotted again? MOS06 0032 D07C v12 MOS06 0097 D0DD 10 03 BPL EMAB ;No, then skip this, as routine plots both anyway MOS06 0032 D07C v12 MOS06 0098 D0DF ; MOS06 0032 D07C v12 MOS06 0099 D0DF [ STARTP=0 MOS06 0032 D07C v12 MOS06 0102 D0DF | MOS06 0032 D07C v12 MOS06 0103 D0DF ; plot end point twice MOS06 0032 D07C v12 MOS06 0104 D0DF 20 FD D0 JSR WPLOT MOS06 0032 D07C v12 MOS06 0105 D0E2 ] MOS06 0032 D07C v12 MOS06 0106 D0E2 ; MOS06 0032 D07C v12 MOS06 0107 D0E2 20 C5 D1 EMAB JSR LINE MOS06 0032 D07C v12 MOS06 0108 D0E5 4C EB D0 JMP EMAEX MOS06 0032 D07C v12 MOS06 0109 D0E8 MOS06 0032 D07C v12 MOS06 0110 D0E8 ;Plot a point MOS06 0032 D07C v12 MOS06 0111 D0E8 MOS06 0032 D07C v12 MOS06 0112 D0E8 20 FD D0 EMAC JSR WPLOT ;Plot only if it is in window MOS06 0032 D07C v12 MOS06 0113 D0EB ;SPLOTY requires that EMAEX preserves carry MOS06 0032 D07C v12 MOS06 0114 D0EB 20 D0 CD EMAEX JSR SWAPB ;Swap current cursor with last cursor -- MOS06 0115 D0EE A0 24 EMAEY LDYIM GCSIR-V ;Copy new point to Icursor -- MOS06 0116 D0F0 A2 20 EMAEZ LDXIM NEWPT-V -- MOS06 0117 D0F2 4C 41 D4 JMP COPYF -- MOS06 0118 D0F5 -- MOS06 0119 D0F5 ;WPLOT windows point at NEWPT and plots it if inside -- MOS06 0120 D0F5 -- MOS06 0121 D0F5 A2 24 WPLOTA LDXIM GCSIR-V ;WPLOTA does this to current graphics cursor -- MOS06 0122 D0F7 20 F1 D7 JSR GADDV ;WPLOTB does this for any point pointed to by X -- MOS06 0123 D0FA F0 06 BEQ PLOT MOS06 0123 D0FA v79 MOS06 0124 D0FC 60 RTS MOS06 0123 D0FA v79 MOS06 0125 D0FD 20 EF D7 WPLOT JSR GADDW ;Window & address NEWPT MOS06 0123 D0FA v79 MOS06 0126 D100 D0 13 BNE PLOTEX ;Out of window, then exit MOS06 0126 D100 v6C MOS06 0127 D102 MOS06 0126 D100 v6C MOS06 0128 D102 ;otherwise fall through to ..... MOS06 MOS06 MOS06 MOS06 Acorn macro assembler Page 29 MOS06 VDU File - MOS06 MOS06 MOS06 0126 D100 v6C MOS06 0129 D102 MOS06 0126 D100 v6C MOS06 0130 D102 ;PLOT plots a point MOS06 0126 D100 v6C MOS06 0131 D102 ;Requires LINEY, ZMEMG, ZGORA, ZGEOR MOS06 0126 D100 v6C MOS06 0132 D102 ;Uses ZTEMP as work byte MOS06 0126 D100 v6C MOS06 0133 D102 ;Alters 1 byte on screen MOS06 0126 D100 v6C MOS06 0134 D102 MOS06 0126 D100 v6C MOS06 0135 D102 AC 1A 03 PLOT LDY YLINE MOS06 0126 D100 v6C MOS06 0136 D105 A5 D1 PLOTS LDA ZMASK MOS06 0126 D100 v6C MOS06 0137 D107 25 D4 AND ZGORA MOS06 0126 D100 v6C MOS06 0138 D109 11 D6 ORAIY ZMEMG MOS06 0126 D100 v6C MOS06 0139 D10B 85 DA STA ZTEMP MOS06 0126 D100 v6C MOS06 0140 D10D A5 D5 LDA ZGEOR MOS06 0126 D100 v6C MOS06 0141 D10F 25 D1 AND ZMASK MOS06 0126 D100 v6C MOS06 0142 D111 45 DA EOR ZTEMP MOS06 0126 D100 v6C MOS06 0143 D113 91 D6 STAIY ZMEMG MOS06 0126 D100 v6C MOS06 0144 D115 60 PLOTEX RTS -- MOS06 0145 D116 -- MOS06 0146 D116 B1 D6 PLOTFF LDAIY ZMEMG ;Plots a full byte -- MOS06 0147 D118 05 D4 ORA ZGORA -- MOS06 0148 D11A 45 D5 EOR ZGEOR -- MOS06 0149 D11C [ MOS125 = &7F -- MOS06 0150 D11C WRSC -- MOS06 0151 D11C ] -- MOS06 0152 D11C 91 D6 STAIY ZMEMG -- MOS06 0153 D11E 60 RTS -- MOS06 0154 D11F -- MOS06 0155 D11F ;WIND windows the point at V+(X), as follows -- MOS06 0156 D11F ;If the point is below the lower limit, the window is 1 -- MOS06 0157 D11F ;If the point is above the upper limit, the window is 2 -- MOS06 0158 D11F ;If the point is within both limits, the window is 0 -- MOS06 0159 D11F ;The total window, returned in A (with z set appropriately) -- MOS06 0160 D11F ;is 4 times the window in the Y direction, plus the window -- MOS06 0161 D11F ;in the X direction. -- MOS06 0162 D11F ;The routine uses ZTEMP as a work byte -- MOS06 0163 D11F ;All windows, as specified by GWxxxx are reckoned as inclusive, -- MOS06 0164 D11F ;with the high byte last. -- MOS06 0165 D11F ;The order of the windows in RAM is reckoned as follows -- MOS06 0166 D11F ;GWLCOL, GWBROW, GWRCOL, GWTROW -- MOS06 0167 D11F -- MOS06 0168 D11F A2 24 WINDCS LDXIM GCSIR-V ;Special entry point to window graphics cursor -- MOS06 0169 D121 -- MOS06 0170 D121 A0 00 WIND LDYIM &00 ;Initialise result -- MOS06 0171 D123 84 DA STY ZTEMP -- MOS06 0172 D125 A0 02 LDYIM &02 ;Do the Y co-ords -- MOS06 0173 D127 20 3A D1 JSR WINDA -- MOS06 0174 D12A 06 DA ASL ZTEMP ;Mult. the Y window by 4 -- MOS06 0175 D12C 06 DA ASL ZTEMP -- MOS06 0176 D12E CA DEX -- MOS06 0177 D12F CA DEX -- MOS06 0178 D130 A0 00 LDYIM &00 ;Do the X window -- MOS06 0179 D132 20 3A D1 JSR WINDA -- MOS06 0180 D135 E8 INX ;Restore X -- MOS06 0181 D136 E8 INX -- MOS06 0182 D137 A5 DA LDA ZTEMP -- MOS06 0183 D139 60 RTS -- MOS06 0184 D13A -- MOS06 0185 D13A ;Subtract margin from point to obtain sign of difference -- MOS06 0186 D13A -- MOS06 0187 D13A BD 02 03 WINDA LDAAX V+&02 ;(LSB) -- MOS06 0188 D13D D9 00 03 CMPAY GWLCOL ;(LSB of lower limit) -- MOS06 0189 D140 BD 03 03 LDAAX V+&03 ;(MSB) -- MOS06 0190 D143 F9 01 03 SBCAY GWLCOL+&01 ;(MSB of lower limit) -- MOS06 0191 D146 30 10 BMI WINDAA MOS06 0191 D146 v6F MOS06 0192 D148 B9 04 03 LDAAY GWRCOL ;(LSB of upper limit) MOS06 0191 D146 v6F MOS06 0193 D14B DD 02 03 CMPAX V+&02 ;(LSB) MOS06 0191 D146 v6F MOS06 0194 D14E B9 05 03 LDAAY GWRCOL+&01 ;(MSB of upper limit) MOS06 0191 D146 v6F MOS06 0195 D151 FD 03 03 SBCAX V+&03 ;(MSB) MOS06 0191 D146 v6F MOS06 0196 D154 10 04 BPL WINDAB ;Is this <= upper limit ? MOS06 0191 D146 v6F MOS06 0197 D156 E6 DA INC ZTEMP MOS06 0191 D146 v6F MOS06 0198 D158 E6 DA WINDAA INC ZTEMP MOS06 0196 D154 v7B MOS06 0199 D15A 60 WINDAB RTS ;No longer referenced from EIG, incidentally, saving TWO WHOLE BYTES !! -- MOS06 0200 D15B -- MOS06 0201 D15B ;EIGABS in some embarassment is to provide EIG in ABSOLUTE co-ords -- MOS06 0202 D15B -- MOS06 0203 D15B A9 FF EIGABS LDAIM &FF -- MOS06 0204 D15D [ MOS125 = &FF -- MOS06 0206 D15D ] -- MOS06 0207 D15D -- MOS06 0208 D15D ;Convert external to internal co-ordinates -- MOS06 0209 D15D -- MOS06 0210 D15D ;EIG converts from external co-ords (either relative or abs) -- MOS06 0211 D15D ;and produces internal ones in situ. No windowing is done. -- MOS06 0212 D15D ;Requires (X) = the offset from V of the points to be converted -- MOS06 0213 D15D ;b2 of PLMODE = 0 for relative co-ords (add the Ecursor) -- MOS06 0214 D15D ; 1 for absolute co-ords (add the origin) -- MOS06 0215 D15D ;GCSR, ORGX, ORGY as usual -- MOS06 0216 D15D ;Writes the transformed co-ordinates from whence they came -- MOS06 0217 D15D ;Also writes new point to external cursor (GCSX,GCSY) -- MOS06 0218 D15D ;hence in triangle relative mode, the points are relative -- MOS06 0219 D15D ;to the last specified, not the original cursor -- MOS06 0220 D15D -- MOS06 0221 D15D ;a) Add the cursor to current posn. if relative -- MOS06 0222 D15D ;& add origin in both cases -- MOS06 0223 D15D -- MOS06 0224 D15D [ MOS125 = &FF -- MOS06 0226 D15D ] -- MOS06 0227 D15D 85 DA EIGC STA ZTEMP -- MOS06 0228 D15F A0 02 LDYIM &02 ;Do this for Y co-ordinates -- MOS06 0229 D161 20 83 D1 JSR EIGS -- MOS06 0230 D164 20 BA D1 JSR DIVAXT ;1024 points vertically -- MOS06 0231 D167 A0 00 LDYIM &00 -- MOS06 0232 D169 CA DEX -- MOS06 0233 D16A CA DEX -- MOS06 0234 D16B 20 83 D1 JSR EIGS ;Do this for X co-ordinates -- MOS06 0235 D16E -- MOS06 0236 D16E ;b) scale down by the necessary factor -- MOS06 0237 D16E ;(EIGS has already divided by 2) -- MOS06 0238 D16E -- MOS06 0239 D16E AC 61 03 LDY NPIX ;How many pixles ? -- MOS06 0240 D171 C0 03 CPYIM &03 -- MOS06 0241 D173 F0 05 BEQ EIGA ;4?, then divide by 4 MOS06 0241 D173 v7A MOS06 0242 D175 B0 06 BCS EIGB ;8?, then divide by 2 MOS06 0242 D175 v79 MOS06 0243 D177 20 BA D1 JSR DIVAXT ;2?, then divide by 8 MOS06 0242 D175 v79 MOS06 0244 D17A 20 BA D1 EIGA JSR DIVAXT MOS06 0242 D175 v79 MOS06 0245 D17D AD 56 03 EIGB LDA MEMODE ;Is it a 10K mode? -- MOS06 0246 D180 D0 38 BNE DIVAXT ;YES, then another divide by 2 MOS06 0246 D180 v47 MOS06 0247 D182 60 RTS ; NO, then skip MOS06 0246 D180 v47 MOS06 0248 D183 MOS06 0246 D180 v47 MOS06 0249 D183 18 EIGS CLC MOS06 0246 D180 v47 MOS06 0250 D184 A5 DA LDA ZTEMP ;Test b2 of plot mode, for rel./abs. MOS06 0246 D180 v47 MOS06 0251 D186 29 04 ANDIM &04 MOS06 MOS06 MOS06 MOS06 Acorn macro assembler Page 30 MOS06 VDU File - MOS06 MOS06 MOS06 0246 D180 v47 MOS06 0252 D188 F0 09 BEQ EIGSA ;Clear, so relative ( & skip ) MOS06 0246 D180 v47 MOS06 0253 D18A BD 02 03 LDAAX V+&02 ;(LSB) ~~~ ABSOLUTE ~~~ MOS06 0246 D180 v47 MOS06 0254 D18D 48 PHA MOS06 0246 D180 v47 MOS06 0255 D18E BD 03 03 LDAAX V+&03 ;(MSB) MOS06 0246 D180 v47 MOS06 0256 D191 90 0E BCC EIGSB ;(branch always taken) MOS06 0246 D180 v47 MOS06 0257 D193 BD 02 03 EIGSA LDAAX V+&02 ;~~~ RELATIVE ~~~ MOS06 0246 D180 v47 MOS06 0258 D196 79 10 03 ADCAY GCSR ;so add prev. cursor (LSB) MOS06 0246 D180 v47 MOS06 0259 D199 48 PHA MOS06 0246 D180 v47 MOS06 0260 D19A BD 03 03 LDAAX V+&03 ;(MSB) MOS06 0246 D180 v47 MOS06 0261 D19D 79 11 03 ADCAY GCSR+&01 MOS06 0246 D180 v47 MOS06 0262 D1A0 18 CLC MOS06 0246 D180 v47 MOS06 0263 D1A1 99 11 03 EIGSB STAAY GCSR+&01 ;Update MSB of cursor MOS06 0246 D180 v47 MOS06 0264 D1A4 79 0D 03 ADCAY ORG+&01 ;Now add origin for both addressing modes ! MOS06 0246 D180 v47 MOS06 0265 D1A7 9D 03 03 STAAX V+&03 ;(MSB) MOS06 0246 D180 v47 MOS06 0266 D1AA 68 PLA ;Pull LSByte MOS06 0246 D180 v47 MOS06 0267 D1AB 99 10 03 STAAY GCSR ;Update LSB of cursor MOS06 0246 D180 v47 MOS06 0268 D1AE 18 CLC MOS06 0246 D180 v47 MOS06 0269 D1AF 79 0C 03 ADCAY ORG ;(LSB) MOS06 0246 D180 v47 MOS06 0270 D1B2 9D 02 03 STAAX V+&02 MOS06 0246 D180 v47 MOS06 0271 D1B5 90 03 BCC DIVAXT MOS06 0246 D180 v47 MOS06 0272 D1B7 FE 03 03 INCAX V+&03 ;Carry into MSB if needs be MOS06 0246 D180 v47 MOS06 0273 D1BA MOS06 0246 D180 v47 MOS06 0274 D1BA ;Divide this by 2 by falling through to ... MOS06 0246 D180 v47 MOS06 0275 D1BA MOS06 0246 D180 v47 MOS06 0276 D1BA BD 03 03 DIVAXT LDAAX V+&03 ;Signed division by 2 -- MOS06 0277 D1BD 0A ASLA ;(Screen now 1280 by 1024) -- MOS06 0278 D1BE 7E 03 03 RORAX V+&03 -- MOS06 0279 D1C1 7E 02 03 RORAX V+&02 -- MOS06 0280 D1C4 [ MOS125 = &FF -- MOS06 0281 D1C4 | -- MOS06 0282 D1C4 LINEX1 -- MOS06 0283 D1C4 ] -- MOS06 0284 D1C4 60 RTS MOS07 0112 D23C ^06 MOS06 0285 D1C5 MOS07 0112 D23C ^06 MOS06 0286 D1C5 [ MOS125 = &FF MOS07 0112 D23C ^06 MOS06 0315 D1C5 ] MOS07 0112 D23C ^06 MOS06 0316 D1C5 MOS07 0112 D23C ^06 MOS06 0317 D1C5 LNK MOS07 MOS07 0112 D23C ^06 MOS07 0001 D1C5 TTL VDU File - MOS07 MOS07 0112 D23C ^06 MOS07 0002 D1C5 OPT MOS07 MOS07 MOS07 MOS07 MOS07 Acorn macro assembler Page 31 MOS07 VDU File - MOS07 MOS07 MOS07 0112 D23C ^06 MOS07 0003 D1C5 MOS07 0112 D23C ^06 MOS07 0004 D1C5 ;Last revision 01/05/82 MOS07 0112 D23C ^06 MOS07 0005 D1C5 MOS07 0112 D23C ^06 MOS07 0006 D1C5 ;01/05/82 Recoded to allow for new order of variables & manifests MOS07 0112 D23C ^06 MOS07 0007 D1C5 ;21/04/82 LINE rewritten MOS07 0112 D23C ^06 MOS07 0008 D1C5 ;19/04/82 One byte saved in SB MOS07 0112 D23C ^06 MOS07 0009 D1C5 ;25/03/82 Change all refs. to BEGSCN+1 to BEGSCN MOS07 0112 D23C ^06 MOS07 0010 D1C5 ;14/11/81 Variable mark space on DOTS removed MOS07 0112 D23C ^06 MOS07 0011 D1C5 MOS07 0112 D23C ^06 MOS07 0012 D1C5 ;******* PLOTTING ******* MOS07 0112 D23C ^06 MOS07 0013 D1C5 MOS07 0112 D23C ^06 MOS07 0014 D1C5 ;LINE plots straight line from cursor to new point MOS07 0112 D23C ^06 MOS07 0015 D1C5 ;taking account windowing, & plotting partial lines MOS07 0112 D23C ^06 MOS07 0016 D1C5 ;if necessary MOS07 0112 D23C ^06 MOS07 0017 D1C5 MOS07 0112 D23C ^06 MOS07 0018 D1C5 ;Requires GCSIR = the current cursor position (I co-ords) MOS07 0112 D23C ^06 MOS07 0019 D1C5 ;NEWPT = the point to plotted to (I co-ords) MOS07 0112 D23C ^06 MOS07 0020 D1C5 ;Windowing is assumed of neither MOS07 0112 D23C ^06 MOS07 0021 D1C5 MOS07 0112 D23C ^06 MOS07 0022 D1C5 MOS07 0112 D23C ^06 MOS07 0023 D1C5 ;Plot a straight line MOS07 0112 D23C ^06 MOS07 0024 D1C5 MOS07 0112 D23C ^06 MOS07 0025 D1C5 20 C4 D3 LINE JSR LINSA ;Find DeltaX & DeltaY to LDELTA MOS07 0112 D23C ^06 MOS07 0026 D1C8 ;LINSB Returns n=1 iff MOD DeltaX < MOD DeltaY MOS07 0112 D23C ^06 MOS07 0027 D1C8 ;Encoded version of a previous routine MOS07 0112 D23C ^06 MOS07 0028 D1C8 MOS07 0112 D23C ^06 MOS07 0029 D1C8 AD 2B 03 LDA LDELTA+&03 ;DY, MSB Are the deltas of the same sign? MOS07 0112 D23C ^06 MOS07 0030 D1CB [ MOS125 = &FF MOS07 0112 D23C ^06 MOS07 0043 D1CB | MOS07 0112 D23C ^06 MOS07 0044 D1CB AA TAX MOS07 0112 D23C ^06 MOS07 0045 D1CC 4D 29 03 EOR LDELTA+&01 ;DX, MSB MOS07 0112 D23C ^06 MOS07 0046 D1CF 0A ASLA MOS07 0112 D23C ^06 MOS07 0047 D1D0 AD 2A 03 LDA LDELTA+&02 MOS07 0112 D23C ^06 MOS07 0048 D1D3 B0 0A BCS LINSBA MOS07 0112 D23C ^06 MOS07 0049 D1D5 CD 28 03 CMP LDELTA ;YES, then compare DeltaY - DeltaX MOS07 0112 D23C ^06 MOS07 0050 D1D8 8A TXA MOS07 0112 D23C ^06 MOS07 0051 D1D9 ED 29 03 SBC LDELTA+&01 MOS07 0112 D23C ^06 MOS07 0052 D1DC 4C E7 D1 JMP LINSBB MOS07 0112 D23C ^06 MOS07 0053 D1DF 18 LINSBA CLC ;NO, then add MOS07 0112 D23C ^06 MOS07 0054 D1E0 6D 28 03 ADC LDELTA MOS07 0112 D23C ^06 MOS07 0055 D1E3 8A TXA MOS07 0112 D23C ^06 MOS07 0056 D1E4 6D 29 03 ADC LDELTA+&01 MOS07 0112 D23C ^06 MOS07 0057 D1E7 ] MOS07 0112 D23C ^06 MOS07 0058 D1E7 6A LINSBB RORA ;c to b7 of A MOS07 0112 D23C ^06 MOS07 0059 D1E8 A2 00 LDXIM &00 MOS07 0112 D23C ^06 MOS07 0060 D1EA 4D 2B 03 EOR LDELTA+&03 ;If DY < 0, then invert b7 of A. Sets n as required MOS07 0112 D23C ^06 MOS07 0061 D1ED ; MOS07 0112 D23C ^06 MOS07 0062 D1ED 10 02 BPL LINEA MOS07 0112 D23C ^06 MOS07 0063 D1EF A2 02 LDXIM &02 MOS07 0112 D23C ^06 MOS07 0064 D1F1 86 DE LINEA STX ZTEMPC ;0 if p.b.X, 2 if p.b.Y MOS07 0112 D23C ^06 MOS07 0065 D1F3 BD AA C4 LDAAX D1JTB ;JVEC initialisation (D1 jump vector) MOS07 0112 D23C ^06 MOS07 0066 D1F6 8D 5D 03 STA JVEC MOS07 0112 D23C ^06 MOS07 0067 D1F9 BD AB C4 LDAAX D1JTB+&01 MOS07 0112 D23C ^06 MOS07 0068 D1FC 8D 5E 03 STA JVEC+&01 MOS07 0112 D23C ^06 MOS07 0069 D1FF [ MOS125 = &FF MOS07 0112 D23C ^06 MOS07 0076 D1FF | MOS07 0112 D23C ^06 MOS07 0077 D1FF A9 24 LDAIM GCSIR-V ;+ve, then LSTART from GCSIR... MOS07 0112 D23C ^06 MOS07 0078 D201 BC 29 03 LDYAX LDELTA+&01 ;Sign of D1 MOS07 0112 D23C ^06 MOS07 0079 D204 30 02 BMI LINEC MOS07 0112 D23C ^06 MOS07 0080 D206 A9 20 LDAIM NEWPT-V ;Copy LSTART from new point MOS07 0112 D23C ^06 MOS07 0081 D208 85 DF LINEC STA ZTEMPC+&01 ;Offset of LSTART (=PStart of old) MOS07 0112 D23C ^06 MOS07 0082 D20A AA TAX MOS07 0112 D23C ^06 MOS07 0083 D20B ] MOS07 0112 D23C ^06 MOS07 0084 D20B A0 2C LDYIM LSTART-V ;Copy to LSTART MOS07 0112 D23C ^06 MOS07 0085 D20D 20 41 D4 JSR COPYF MOS07 0112 D23C ^06 MOS07 0086 D210 A5 DF LDA ZTEMPC+&01 ;Get Horizontal co-ordinate of other (end) point MOS07 0112 D23C ^06 MOS07 0087 D212 49 04 EORIM &04 ;This requires NEWPT to be multiple of 8 & GCSIR 4 above it MOS07 0112 D23C ^06 MOS07 0088 D214 85 DD STA ZTEMPB+&01 MOS07 0112 D23C ^06 MOS07 0089 D216 05 DE ORA ZTEMPC ;Get Hend (horizontal co-ordinate of endpoint) MOS07 0112 D23C ^06 MOS07 0090 D218 AA TAX MOS07 0112 D23C ^06 MOS07 0091 D219 20 37 D4 JSR COPY2H MOS07 0112 D23C ^06 MOS07 0092 D21C AD 1F 03 LDA PLMODE ;Initialise dotted line test MOS07 0112 D23C ^06 MOS07 0093 D21F 29 10 ANDIM &10 ;Isolate b4 MOS07 0112 D23C ^06 MOS07 0094 D221 0A ASLA MOS07 0112 D23C ^06 MOS07 0095 D222 0A ASLA MOS07 0112 D23C ^06 MOS07 0096 D223 0A ASLA ;now $80 if plot dotted line, $00 if full line MOS07 0112 D23C ^06 MOS07 0097 D224 85 DB STA ZTEMP+&01 MOS07 0112 D23C ^06 MOS07 0098 D226 A2 2C LDXIM LSTART-V ;Window start point LSTART MOS07 0112 D23C ^06 MOS07 0099 D228 20 21 D1 JSR WIND MOS07 0112 D23C ^06 MOS07 0100 D22B 85 DC STA ZTEMPB MOS07 0112 D23C ^06 MOS07 0101 D22D F0 06 BEQ LINED MOS07 0112 D23C ^06 MOS07 0102 D22F A9 40 LDAIM &40 ;Start point not inside, so slow plot MOS07 0112 D23C ^06 MOS07 0103 D231 05 DB ORA ZTEMP+&01 MOS07 0112 D23C ^06 MOS07 0104 D233 85 DB STA ZTEMP+&01 MOS07 0112 D23C ^06 MOS07 0105 D235 A6 DD LINED LDX ZTEMPB+&01 ;Window other point MOS07 0112 D23C ^06 MOS07 0106 D237 20 21 D1 JSR WIND MOS07 0112 D23C ^06 MOS07 0107 D23A 24 DC BIT ZTEMPB ;Anything to do ? MOS07 0112 D23C ^06 MOS07 0108 D23C [ MOS125 = &FF MOS07 0112 D23C ^06 MOS07 0111 D23C | MOS07 0112 D23C ^06 MOS07 0112 D23C D0 86 BNE LINEX1 ;No, then exit -- MOS07 0113 D23E ] -- MOS07 0114 D23E A6 DE LINEE LDX ZTEMPC ;Isolate 2nd horizontal window -- MOS07 0115 D240 F0 02 BEQ LINEF MOS07 0115 D240 v7D MOS07 0116 D242 4A LSRA MOS07 0115 D240 v7D MOS07 0117 D243 4A LSRA MOS07 0115 D240 v7D MOS07 0118 D244 29 02 LINEF ANDIM &02 -- MOS07 0119 D246 F0 07 BEQ LINEG ;Zero, so Hend is in window MOS07 0119 D246 v78 MOS07 0120 D248 8A TXA ;Point X to upper margin! MOS07 0119 D246 v78 MOS07 0121 D249 09 04 ORAIM GWRCOL-V ;Assumes GWLCOL-V is a multiple of 4 MOS07 0119 D246 v78 MOS07 0122 D24B AA TAX ;Endpoint outside horizontal window, MOS07 0119 D246 v78 MOS07 0123 D24C 20 37 D4 JSR COPY2H ;so alter Hend to high margin MOS07 0119 D246 v78 MOS07 0124 D24F 20 E3 D3 LINEG JSR LINSG ;Get L values & MOD deltas -- MOS07 0125 D252 A5 DE LDA ZTEMPC -- MOS07 0126 D254 49 02 EORIM &02 -- MOS07 0127 D256 AA TAX ;Unsigned D2 -- MOS07 0128 D257 A8 TAY -- MOS07 0129 D258 AD 29 03 LDA LDELTA+&01 ;Sign of D2 ? -- MOS07 0130 D25B 4D 2B 03 EOR LDELTA+&03 -- MOS07 0131 D25E 10 01 BPL LINEH MOS07 0131 D25E v7E MOS07 0132 D260 E8 INX ;Signed D2 - E,W,N,S MOS07 0131 D25E v7E MOS07 0133 D261 BD AE C4 LINEH LDAAX D2JTBL ;Initialise D2 jump vector -- MOS07 0134 D264 8D 32 03 STA D2JVEC -- MOS07 0135 D267 BD B2 C4 LDAAX D2JTBH -- MOS07 0136 D26A 8D 33 03 STA D2JVEC+&01 -- MOS07 0137 D26D A9 7F LDAIM &7F ;dotted line initialisation -- MOS07 0138 D26F 8D 34 03 STA DOTFLG -- MOS07 0139 D272 24 DB BIT ZTEMP+&01 -- MOS07 0140 D274 70 29 BVS LINEI ;Slow plot , so set ZTEMPC strangely MOS07 0140 D274 v56 MOS07 0141 D276 BD 47 C4 LDAAX EWTBA ;(4,0,6,2) Calculate V points MOS07 0140 D274 v56 MOS07 0142 D279 AA TAX MOS07 0140 D274 v56 MOS07 0143 D27A 38 SEC MOS07 MOS07 MOS07 MOS07 Acorn macro assembler Page 32 MOS07 VDU File - MOS07 MOS07 MOS07 0140 D274 v56 MOS07 0144 D27B BD 00 03 LDAAX GWLCOL MOS07 0140 D274 v56 MOS07 0145 D27E F9 2C 03 SBCAY LSTART MOS07 0140 D274 v56 MOS07 0146 D281 85 DA STA ZTEMP MOS07 0140 D274 v56 MOS07 0147 D283 BD 01 03 LDAAX GWLCOL+&01 MOS07 0140 D274 v56 MOS07 0148 D286 F9 2D 03 SBCAY LSTART+&01 MOS07 0140 D274 v56 MOS07 0149 D289 A4 DA LDY ZTEMP MOS07 0140 D274 v56 MOS07 0150 D28B AA TAX ;Ensure +ve MOS07 0140 D274 v56 MOS07 0151 D28C 10 03 BPL LINEH1 MOS07 0140 D274 v56 MOS07 0152 D28E 20 52 D4 JSR NEGAY MOS07 0140 D274 v56 MOS07 0153 D291 AA LINEH1 TAX ;MSB of no. V points MOS07 0140 D274 v56 MOS07 0154 D292 C8 INY ;Increment this no. MOS07 0140 D274 v56 MOS07 0155 D293 D0 01 BNE LINEH2 MOS07 0140 D274 v56 MOS07 0156 D295 E8 INX MOS07 0140 D274 v56 MOS07 0157 D296 8A LINEH2 TXA ;MSB non-zero ? MOS07 0140 D274 v56 MOS07 0158 D297 F0 02 BEQ LINEH3 MOS07 0140 D274 v56 MOS07 0159 D299 A0 00 LDYIM &00 ;Yes, then no limit to no. of vertical points MOS07 0140 D274 v56 MOS07 0160 D29B 84 DF LINEH3 STY ZTEMPC+&01 ; Zero is always set here MOS07 0140 D274 v56 MOS07 0161 D29D F0 09 BEQ LINEJ1 MOS07 0140 D274 v56 MOS07 0162 D29F 8A LINEI TXA ;b7 = sign of D2. b1=D2 MOS07 0161 D29D v76 MOS07 0163 D2A0 4A LSRA MOS07 0161 D29D v76 MOS07 0164 D2A1 6A RORA MOS07 0161 D29D v76 MOS07 0165 D2A2 09 02 ORAIM &02 MOS07 0161 D29D v76 MOS07 0166 D2A4 45 DE EOR ZTEMPC MOS07 0161 D29D v76 MOS07 0167 D2A6 85 DE STA ZTEMPC MOS07 0161 D29D v76 MOS07 0168 D2A8 A2 2C LINEJ1 LDXIM LSTART-V ;Address the first point -- MOS07 0169 D2AA 20 F6 D7 JSR GADDR ;Now loads YLINE to Y -- MOS07 0170 D2AD A6 DC LDX ZTEMPB -- MOS07 0171 D2AF D0 02 BNE LINEN MOS07 0171 D2AF v7D MOS07 0172 D2B1 C6 DD DEC ZTEMPB+&01 MOS07 0171 D2AF v7D MOS07 0173 D2B3 CA LINEN DEX -- MOS07 0174 D2B4 ; -- MOS07 0175 D2B4 ; Fall through to main plot routine -- MOS07 0176 D2B4 ; -- MOS07 0177 D2B4 A5 DB LINEJ LDA ZTEMP +&01 ;Was midpoint or DOTS referenced ? -- MOS07 0178 D2B6 F0 1F BEQ DOTYES ;No?, then run along MOS07 0178 D2B6 v60 MOS07 0179 D2B8 10 10 BPL MPTEST ;No, then do midpoint test MOS07 0178 D2B6 v60 MOS07 0180 D2BA 2C 34 03 BIT DOTFLG ;b7 set, then dotted MOS07 0178 D2B6 v60 MOS07 0181 D2BD 10 05 BPL DOTY ;Branch if last was a space MOS07 0178 D2B6 v60 MOS07 0182 D2BF CE 34 03 DEC DOTFLG ;now to $7F MOS07 0178 D2B6 v60 MOS07 0183 D2C2 D0 23 BNE DOTNO ;(branch always taken) MOS07 0183 D2C2 v5C MOS07 0184 D2C4 EE 34 03 DOTY INC DOTFLG ;to $80 MOS07 0183 D2C2 v5C MOS07 0185 D2C7 0A ASLA MOS07 0183 D2C2 v5C MOS07 0186 D2C8 10 0D BPL DOTYES ;No?, then plot the point MOS07 0183 D2C2 v5C MOS07 0187 D2CA 86 DC MPTEST STX ZTEMPB ;Store X temporarily MOS07 0183 D2C2 v5C MOS07 0188 D2CC A2 2C LDXIM LSTART-V ;Window the point at Q +0D (PStart) MOS07 0183 D2C2 v5C MOS07 0189 D2CE 20 F1 D7 JSR GADDV ;& address if window was successful MOS07 0183 D2C2 v5C MOS07 0190 D2D1 A6 DC LDX ZTEMPB ;Restore X MOS07 0183 D2C2 v5C MOS07 0191 D2D3 09 00 ORAIM &00 ;To TSTA (a la 6800) (result of window) MOS07 0183 D2C2 v5C MOS07 0192 D2D5 D0 10 BNE DOTNO ;Outside?, then skip the plot MOS07 0183 D2C2 v5C MOS07 0193 D2D7 A5 D1 DOTYES LDA ZMASK ;Plot the point MOS07 0183 D2C2 v5C MOS07 0194 D2D9 25 D4 AND ZGORA MOS07 0183 D2C2 v5C MOS07 0195 D2DB 11 D6 ORAIY ZMEMG MOS07 0183 D2C2 v5C MOS07 0196 D2DD 85 DA STA ZTEMP MOS07 0183 D2C2 v5C MOS07 0197 D2DF A5 D5 LDA ZGEOR MOS07 0183 D2C2 v5C MOS07 0198 D2E1 25 D1 AND ZMASK MOS07 0183 D2C2 v5C MOS07 0199 D2E3 45 DA EOR ZTEMP MOS07 0183 D2C2 v5C MOS07 0200 D2E5 91 D6 STAIY ZMEMG MOS07 0183 D2C2 v5C MOS07 0201 D2E7 MOS07 0183 D2C2 v5C MOS07 0202 D2E7 ;L := L - DeltaV MOS07 0183 D2C2 v5C MOS07 0203 D2E7 MOS07 0183 D2C2 v5C MOS07 0204 D2E7 38 DOTNO SEC -- MOS07 0205 D2E8 AD 35 03 LDA LPARMS ;L,LSB -- MOS07 0206 D2EB ED 37 03 SBC LPARMS+&02 ;DeltaV,LSB -- MOS07 0207 D2EE 8D 35 03 STA LPARMS -- MOS07 0208 D2F1 AD 36 03 LDA LPARMS+&01 ;L,MSB -- MOS07 0209 D2F4 ED 38 03 SBC LPARMS+&03 ;DeltaV,MSB -- MOS07 0210 D2F7 B0 11 BCS LINED1 ;Skip if D2 not to be taken ( L > 0 ) MOS07 0210 D2F7 v6E MOS07 0211 D2F9 85 DA STA ZTEMP ;D2 must be taken, thus MOS07 0210 D2F7 v6E MOS07 0212 D2FB AD 35 03 LDA LPARMS ;L := L + DeltaH MOS07 0210 D2F7 v6E MOS07 0213 D2FE 6D 39 03 ADC LPARMS+&04 ;LSB of DeltaH (c=0) MOS07 0210 D2F7 v6E MOS07 0214 D301 8D 35 03 STA LPARMS MOS07 0210 D2F7 v6E MOS07 0215 D304 A5 DA LDA ZTEMP MOS07 0210 D2F7 v6E MOS07 0216 D306 6D 3A 03 ADC LPARMS+&05 ;MSB of DeltaH MOS07 0210 D2F7 v6E MOS07 0217 D309 18 CLC ;Do do D2 MOS07 0210 D2F7 v6E MOS07 0218 D30A 8D 36 03 LINED1 STA LPARMS+&01 ;Store MSB of L, preserving c -- MOS07 0219 D30D 08 PHP ;Needed for decrementing no. of V points -- MOS07 0220 D30E B0 09 BCS LINEE1 ;Don't do D2 if you're not meant to MOS07 0220 D30E v76 MOS07 0221 D310 6C 32 03 JMI D2JVEC ;Jump to D2, through JVEC2, to xB (below) MOS07 0220 D30E v76 MOS07 0222 D313 88 NB DEY MOS07 0220 D30E v76 MOS07 0223 D314 10 03 BPL LINEE1 ;~~~~~~~~~~~~~~ D2 KING MOVES ~~~~~~~~~~~~~~ MOS07 0220 D30E v76 MOS07 0224 D316 20 ED CB JSR NBDY MOS07 0220 D30E v76 MOS07 0225 D319 6C 5D 03 LINEE1 JMI JVEC MOS07 0246 D347 ^50 MOS07 0226 D31C C8 SB INY MOS07 0246 D347 ^50 MOS07 0227 D31D C0 08 CPYIM &08 MOS07 0246 D347 ^50 MOS07 0228 D31F D0 F8 BNE LINEE1 MOS07 0246 D347 ^50 MOS07 0229 D321 18 CLC ; encoded version of SBDY MOS07 0246 D347 ^50 MOS07 0230 D322 A5 D6 LDA ZMEMG MOS07 0246 D347 ^50 MOS07 0231 D324 6D 52 03 ADC BYTROW MOS07 0246 D347 ^50 MOS07 0232 D327 85 D6 STA ZMEMG MOS07 0246 D347 ^50 MOS07 0233 D329 A5 D7 LDA ZMEMG +&01 MOS07 0246 D347 ^50 MOS07 0234 D32B 6D 53 03 ADC BYTROW +&01 MOS07 0246 D347 ^50 MOS07 0235 D32E 10 04 BPL SBDYA MOS07 0246 D347 ^50 MOS07 0236 D330 38 SEC MOS07 0246 D347 ^50 MOS07 0237 D331 ED 54 03 SBC BYTSCN MOS07 0246 D347 ^50 MOS07 0238 D334 85 D7 SBDYA STA ZMEMG +&01 MOS07 0246 D347 ^50 MOS07 0239 D336 A0 00 LDYIM &00 MOS07 0246 D347 ^50 MOS07 0240 D338 6C 5D 03 JMI JVEC MOS07 0246 D347 ^50 MOS07 0241 D33B 46 D1 EB LSR ZMASK MOS07 0246 D347 ^50 MOS07 0242 D33D 90 DA BCC LINEE1 MOS07 0246 D347 ^50 MOS07 0243 D33F 20 A4 D3 JSR EBDY MOS07 0246 D347 ^50 MOS07 0244 D342 6C 5D 03 JMI JVEC MOS07 0246 D347 ^50 MOS07 0245 D345 06 D1 WB ASL ZMASK MOS07 0246 D347 ^50 MOS07 0246 D347 90 D0 BCC LINEE1 -- MOS07 0247 D349 20 B4 D3 JSR WBDY -- MOS07 0248 D34C 6C 5D 03 JMI JVEC -- MOS07 0249 D34F 88 NA DEY -- MOS07 0250 D350 10 0C BPL LINEF1 ;~~~~~~~~~~~~~~ D1 KING MOVES ~~~~~~~~~~~~~~ MOS07 0250 D350 v73 MOS07 0251 D352 20 ED CB JSR NBDY MOS07 0250 D350 v73 MOS07 0252 D355 D0 07 BNE LINEF1 ; NBDY returns Zero false MOS07 0250 D350 v73 MOS07 0253 D357 46 D1 EA LSR ZMASK MOS07 0250 D350 v73 MOS07 0254 D359 90 03 BCC LINEF1 MOS07 0250 D350 v73 MOS07 0255 D35B 20 A4 D3 JSR EBDY MOS07 0250 D350 v73 MOS07 0256 D35E 28 LINEF1 PLP ;Did D2 occur ? Result to c (c=0 if it did) -- MOS07 0257 D35F E8 INX ;Inc no. H points left to plot (following preserves c) -- MOS07 0258 D360 D0 04 BNE LINEG1 MOS07 0258 D360 v7B MOS07 0259 D362 E6 DD INC ZTEMPB +&01 MOS07 0258 D360 v7B MOS07 0260 D364 F0 0A BEQ LINEX ;Zero?, then exit MOS07 0260 D364 v75 MOS07 0261 D366 24 DB LINEG1 BIT ZTEMP +&01 ;Was midpoint referenced? (preserves c) MOS07 0260 D364 v75 MOS07 0262 D368 70 07 BVS FRIGA ;Yes, then go to the nasty bit MOS07 0260 D364 v75 MOS07 0263 D36A B0 35 BCS LINEK ;D2 ?, then test V window. c from last PLP MOS07 0263 D36A v4A MOS07 0264 D36C C6 DF DEC ZTEMPC +&01 ;Off V window ?, then exit MOS07 MOS07 MOS07 MOS07 Acorn macro assembler Page 33 MOS07 VDU File - MOS07 MOS07 MOS07 0263 D36A v4A MOS07 0265 D36E D0 31 BNE LINEK MOS07 0263 D36A v4A MOS07 0266 D370 60 LINEX RTS MOS07 0263 D36A v4A MOS07 0267 D371 A5 DE FRIGA LDA ZTEMPC ;Which direction was D2 ? MOS07 0263 D36A v4A MOS07 0268 D373 86 DC STX ZTEMPB MOS07 0263 D36A v4A MOS07 0269 D375 29 02 ANDIM &02 MOS07 0263 D36A v4A MOS07 0270 D377 AA TAX MOS07 0263 D36A v4A MOS07 0271 D378 B0 19 BCS FRIGC ;No D2?, then skip the adjustment of V MOS07 0263 D36A v4A MOS07 0272 D37A 24 DE BIT ZTEMPC ;Was D2 +ve ? MOS07 0263 D36A v4A MOS07 0273 D37C 30 0A BMI FRIGB MOS07 0263 D36A v4A MOS07 0274 D37E FE 2C 03 INCAX LSTART ;D2 +ve, so increment V co-ord MOS07 0263 D36A v4A MOS07 0275 D381 D0 10 BNE FRIGC MOS07 0263 D36A v4A MOS07 0276 D383 FE 2D 03 INCAX LSTART+&01 MOS07 0263 D36A v4A MOS07 0277 D386 90 0B BCC FRIGC ;(branch always taken) MOS07 0263 D36A v4A MOS07 0278 D388 BD 2C 03 FRIGB LDAAX LSTART ;D2 -ve, so dec. the V co-ord. MOS07 0263 D36A v4A MOS07 0279 D38B D0 03 BNE FRIGF MOS07 0263 D36A v4A MOS07 0280 D38D DE 2D 03 DECAX LSTART+&01 MOS07 0263 D36A v4A MOS07 0281 D390 DE 2C 03 FRIGF DECAX LSTART MOS07 0263 D36A v4A MOS07 0282 D393 8A FRIGC TXA ;Get offset of D1 MOS07 0263 D36A v4A MOS07 0283 D394 49 02 EORIM &02 MOS07 0263 D36A v4A MOS07 0284 D396 AA TAX MOS07 0263 D36A v4A MOS07 0285 D397 FE 2C 03 INCAX LSTART ;D1 +ve,so inc. H co-ord MOS07 0263 D36A v4A MOS07 0286 D39A D0 03 BNE FRIGD MOS07 0263 D36A v4A MOS07 0287 D39C FE 2D 03 INCAX LSTART+&01 MOS07 0263 D36A v4A MOS07 0288 D39F A6 DC FRIGD LDX ZTEMPB MOS07 0263 D36A v4A MOS07 0289 D3A1 4C B4 D2 LINEK JMP LINEJ -- MOS07 0290 D3A4 -- MOS07 0291 D3A4 ;BOUNDARY ROUTINES -- MOS07 0292 D3A4 -- MOS07 0293 D3A4 [ MOS125 = &FF -- MOS07 0309 D3A4 ] -- MOS07 0310 D3A4 -- MOS07 0311 D3A4 ;EAST -- MOS07 0312 D3A4 -- MOS07 0313 D3A4 AD 62 03 EBDY LDA MASKL -- MOS07 0314 D3A7 85 D1 STA ZMASK -- MOS07 0315 D3A9 A5 D6 LDA ZMEMG -- MOS07 0316 D3AB 69 07 ADCIM &07 ;c=1 from branch not taken to call this -- MOS07 0317 D3AD 85 D6 STA ZMEMG -- MOS07 0318 D3AF 90 02 BCC EBDYA MOS07 0318 D3AF v7D MOS07 0319 D3B1 E6 D7 INC ZMEMG +&01 MOS07 0318 D3AF v7D MOS07 0320 D3B3 60 EBDYA RTS -- MOS07 0321 D3B4 -- MOS07 0322 D3B4 ;WEST -- MOS07 0323 D3B4 -- MOS07 0324 D3B4 AD 63 03 WBDY LDA MASKR ;encoded version of WBDY -- MOS07 0325 D3B7 85 D1 STA ZMASK -- MOS07 0326 D3B9 A5 D6 LDA ZMEMG -- MOS07 0327 D3BB D0 02 BNE WBDYA MOS07 0327 D3BB v7D MOS07 0328 D3BD C6 D7 DEC ZMEMG +&01 MOS07 0327 D3BB v7D MOS07 0329 D3BF E9 08 WBDYA SBCIM &08 ;c=1 from failure of BCC -- MOS07 0330 D3C1 85 D6 STA ZMEMG -- MOS07 0331 D3C3 60 RTS -- MOS07 0332 D3C4 -- MOS07 0333 D3C4 LNK MOS08 -- MOS08 0001 D3C4 -- MOS08 0002 D3C4 TTL VDU File - MOS08 -- MOS08 0003 D3C4 OPT MOS08 MOS08 MOS08 MOS08 MOS08 Acorn macro assembler Page 34 MOS08 VDU File - MOS08 MOS08 -- MOS08 0004 D3C4 -- MOS08 0005 D3C4 ;Last revision 18/05/82 -- MOS08 0006 D3C4 ; -- MOS08 0007 D3C4 ;18/05/82 External graphics cursor now updated on exit of SPLOT -- MOS08 0008 D3C4 ;04/05/82 SPLOT routine entered -- MOS08 0009 D3C4 ;01/05/82 Recoded using new variable order & manifests -- MOS08 0010 D3C4 ;21/04/82 Most of this deleted ! LINSG modified for new LINE routine -- MOS08 0011 D3C4 ;19/04/82 Byte saving in LINSCE -- MOS08 0012 D3C4 -- MOS08 0013 D3C4 ;LINSA calculates Delta X & Delta Y -- MOS08 0014 D3C4 ;(New point - cursor), where both are in Ico-ords -- MOS08 0015 D3C4 ;Max. I value always assumed to be $8000, as arithmetic -- MOS08 0016 D3C4 ;is performed in 2's comp., 16 bit -- MOS08 0017 D3C4 ;New point in NEWPT, results to LDELTA -- MOS08 0018 D3C4 -- MOS08 0019 D3C4 A0 28 LINSA LDYIM LDELTA-V ;Offset of results from V -- MOS08 0020 D3C6 A2 20 LDXIM NEWPT-V ;Offset of operands, from V -- MOS08 0021 D3C8 -- MOS08 0022 D3C8 ;fall through to ....... -- MOS08 0023 D3C8 -- MOS08 0024 D3C8 ;TRISA calculates Delta X & Delta Y for operands starting -- MOS08 0025 D3C8 ;at V+(X), and results to V+(Y). Calculation from -- MOS08 0026 D3C8 ;(Point at (V+(X)+4)) - (Point at (V+(X))) -- MOS08 0027 D3C8 -- MOS08 0028 D3C8 20 CF D3 TRISA JSR TRISAA -- MOS08 0029 D3CB E8 INX -- MOS08 0030 D3CC E8 INX -- MOS08 0031 D3CD C8 INY -- MOS08 0032 D3CE C8 INY -- MOS08 0033 D3CF 38 TRISAA SEC -- MOS08 0034 D3D0 BD 04 03 LDAAX V+&04 -- MOS08 0035 D3D3 FD 00 03 SBCAX V -- MOS08 0036 D3D6 99 00 03 STAAY V -- MOS08 0037 D3D9 BD 05 03 LDAAX V+&05 -- MOS08 0038 D3DC FD 01 03 SBCAX V+&01 -- MOS08 0039 D3DF 99 01 03 STAAY V+&01 -- MOS08 0040 D3E2 60 RTS -- MOS08 0041 D3E3 -- MOS08 0042 D3E3 ;LINSG calculates no. H points before H exit -- MOS08 0043 D3E3 ;putting 2's comp. to ZTEMPB,ZTEMPB +01 (LSB 1st). -- MOS08 0044 D3E3 ;Initialises MOD DELTAs & L -- MOS08 0045 D3E3 ;Requires ZTEMPB as usual, destroying original data -- MOS08 0046 D3E3 -- MOS08 0047 D3E3 A5 DE LINSG LDA ZTEMPC ;Calc. MOD DELTAs. -- MOS08 0048 D3E5 D0 07 BNE LINSGB ;Plot by Y, so straight copy MOS08 0048 D3E5 v78 MOS08 0049 D3E7 A2 28 LDXIM LDELTA-V ;Swap DeltaX & DeltaY MOS08 0048 D3E5 v78 MOS08 0050 D3E9 A0 2A LDYIM LDELTA+&02-V MOS08 0048 D3E5 v78 MOS08 0051 D3EB 20 CC CD JSR SWAP2 MOS08 0048 D3E5 v78 MOS08 0052 D3EE A2 28 LINSGB LDXIM LDELTA-V ;Copy from modified DX & DY (now DH & DV) -- MOS08 0053 D3F0 A0 37 LDYIM LPARMS+&02-V ;to LPARMS+2=LDELTA -- MOS08 0054 D3F2 20 41 D4 JSR COPYF ;Copy 4 bytes -- MOS08 0055 D3F5 -- MOS08 0056 D3F5 ;Initialise No. H points -- MOS08 0057 D3F5 -- MOS08 0058 D3F5 38 SEC -- MOS08 0059 D3F6 A6 DE LDX ZTEMPC -- MOS08 0060 D3F8 AD 30 03 LDA HEND ;He, LSB -- MOS08 0061 D3FB FD 2C 03 SBCAX LSTART ;HSt, LSB -- MOS08 0062 D3FE A8 TAY -- MOS08 0063 D3FF AD 31 03 LDA HEND+&01 ;He, MSB -- MOS08 0064 D402 FD 2D 03 SBCAX LSTART+&01 ;HSt, MSB -- MOS08 0065 D405 30 03 BMI LINSGA ;Ensure in 2's comp. MOS08 0065 D405 v7C MOS08 0066 D407 20 52 D4 JSR NEGAY MOS08 0065 D405 v7C MOS08 0067 D40A 85 DD LINSGA STA ZTEMPB +&01 -- MOS08 0068 D40C 84 DC STY ZTEMPB -- MOS08 0069 D40E -- MOS08 0070 D40E ;now initialise L & MODULO the DH & DV -- MOS08 0071 D40E -- MOS08 0072 D40E A2 35 LDXIM LPARMS-V ;Point to the deltas -- MOS08 0073 D410 -- MOS08 0074 D410 ;& fall through to ... -- MOS08 0075 D410 -- MOS08 0076 D410 ;TRISB Set up L & MODULO deltas. -- MOS08 0077 D410 ;Assumes V+(X) points to LL,LH,DVL,DVH,DHL,DHH -- MOS08 0078 D410 ;Sets all Dxy to ABS in situ. Sets L := DH/2 (2 byte arith) -- MOS08 0079 D410 -- MOS08 0080 D410 20 1E D4 TRISB JSR TRISBA ;Do DH -- MOS08 0081 D413 4A LSRA -- MOS08 0082 D414 9D 01 03 STAAX V+&01 ;Initialise LH -- MOS08 0083 D417 98 TYA ;Now do LL -- MOS08 0084 D418 6A RORA -- MOS08 0085 D419 9D 00 03 STAAX V -- MOS08 0086 D41C CA DEX ;Now DV -- MOS08 0087 D41D CA DEX -- MOS08 0088 D41E BC 04 03 TRISBA LDYAX V+&04 ;LSB -- MOS08 0089 D421 BD 05 03 LDAAX V+&05 ;MSB -- MOS08 0090 D424 10 0C BPL TRISBB ;Find ABS value MOS08 0090 D424 v73 MOS08 0091 D426 20 52 D4 JSR NEGAY MOS08 0090 D424 v73 MOS08 0092 D429 9D 05 03 STAAX V+&05 ;PAIN - why the hell isn't there a STYAX on this wretched chip ?? MOS08 0090 D424 v73 MOS08 0093 D42C 48 PHA MOS08 0090 D424 v73 MOS08 0094 D42D 98 TYA MOS08 0090 D424 v73 MOS08 0095 D42E 9D 04 03 STAAX V+&04 MOS08 0090 D424 v73 MOS08 0096 D431 68 PLA MOS08 0090 D424 v73 MOS08 0097 D432 60 TRISBB RTS -- MOS08 0098 D433 -- MOS08 0099 D433 -- MOS08 0100 D433 ;COPYF copies 4 bytes from (V)+(X) to (V)+(Y) -- MOS08 0101 D433 -- MOS08 0102 D433 A9 08 COPY8 LDAIM &08 -- MOS08 0103 D435 D0 0C BNE COPY MOS08 0103 D435 v73 MOS08 0104 D437 MOS08 0103 D435 v73 MOS08 0105 D437 A0 30 COPY2H LDYIM HEND-V MOS08 0103 D435 v73 MOS08 0106 D439 A9 02 COPY2 LDAIM &02 MOS08 0103 D435 v73 MOS08 0107 D43B D0 06 BNE COPY MOS08 0103 D435 v73 MOS08 0108 D43D MOS08 0103 D435 v73 MOS08 0109 D43D A0 28 COPYFA LDYIM APCS1-V MOS08 0103 D435 v73 MOS08 0110 D43F A2 24 COPYFB LDXIM GCSIR-V MOS08 0103 D435 v73 MOS08 0111 D441 A9 04 COPYF LDAIM &04 ;SPLOTY requires that c preserved MOS08 0103 D435 v73 MOS08 0112 D443 85 DA COPY STA ZTEMP -- MOS08 0113 D445 BD 00 03 COPYA LDAAX V MOS08 0118 D44F ^74 MOS08 0114 D448 99 00 03 STAAY V MOS08 0118 D44F ^74 MOS08 0115 D44B E8 INX MOS08 0118 D44F ^74 MOS08 0116 D44C C8 INY MOS08 0118 D44F ^74 MOS08 0117 D44D C6 DA DEC ZTEMP MOS08 0118 D44F ^74 MOS08 0118 D44F D0 F4 BNE COPYA -- MOS08 0119 D451 60 RTS -- MOS08 0120 D452 -- MOS08 0121 D452 48 NEGAY PHA ;Negate (AY) - push MSB -- MOS08 0122 D453 98 TYA -- MOS08 0123 D454 49 FF EORIM &FF -- MOS08 0124 D456 A8 TAY MOS08 MOS08 MOS08 MOS08 Acorn macro assembler Page 35 MOS08 VDU File - MOS08 MOS08 -- MOS08 0125 D457 68 PLA -- MOS08 0126 D458 49 FF EORIM &FF -- MOS08 0127 D45A [ MOS125 = &FF -- MOS08 0133 D45A | -- MOS08 0134 D45A C0 FF CPYIM &FF -- MOS08 0135 D45C C8 INY -- MOS08 0136 D45D 69 00 ADCIM &00 -- MOS08 0137 D45F 60 RTS -- MOS08 0138 D460 ] -- MOS08 0139 D460 -- MOS08 0140 D460 20 EF D7 SPF JSR GADDW ;Address new point COMMON CODE -- MOS08 0141 D463 D0 08 BNE SPFA ;Off window?, then exit MOS08 0141 D463 v77 MOS08 0142 D465 B1 D6 LDAIY ZMEMG ;Get the current byte MOS08 0141 D463 v77 MOS08 0143 D467 4D 5A 03 EOR BGCOLF ;Set b/g pixels to zero MOS08 0141 D463 v77 MOS08 0144 D46A 85 DA STA ZTEMP MOS08 0141 D463 v77 MOS08 0145 D46C 60 RTS MOS08 0141 D463 v77 MOS08 0146 D46D 68 SPFA PLA -- MOS08 0147 D46E 68 PLA -- MOS08 0148 D46F -- MOS08 0149 D46F ; & fall through to -- MOS08 0150 D46F -- MOS08 0151 D46F EE 26 03 SPLOTY INC GCSIY ;Failed, so make the L.H. cursor > R.H. MOS08 0162 D47A ^73 MOS08 0152 D472 4C FB D4 JMP SPLOTX MOS08 0162 D47A ^73 MOS08 0153 D475 MOS08 0162 D47A ^73 MOS08 0154 D475 ;SPLOT plots from the new point left & right MOS08 0162 D47A ^73 MOS08 0155 D475 ; until it finds a pixel which is NOT background colour MOS08 0162 D47A ^73 MOS08 0156 D475 ; It scans a byte at a time if possible, taking a lot MOS08 0162 D47A ^73 MOS08 0157 D475 ; of code. MOS08 0162 D47A ^73 MOS08 0158 D475 MOS08 0162 D47A ^73 MOS08 0159 D475 MOS08 0162 D47A ^73 MOS08 0160 D475 20 60 D4 SPLOT JSR SPF MOS08 0162 D47A ^73 MOS08 0161 D478 25 D1 AND ZMASK ;Is the new point in b/g? MOS08 0162 D47A ^73 MOS08 0162 D47A D0 F3 BNE SPLOTY ;No?, then exit -- MOS08 0163 D47C A2 00 LDXIM &00 ;Set up for plotting to the left -- MOS08 0164 D47E 20 44 D5 JSR SPS ;Corrupts all registers -- MOS08 0165 D481 F0 2D BEQ SPLOTE ;Nothing to do MOS08 0165 D481 v52 MOS08 0166 D483 AC 1A 03 LDY YLINE MOS08 0165 D481 v52 MOS08 0167 D486 06 D1 ASL ZMASK ;Don't want to plot the midpoint again MOS08 0165 D481 v52 MOS08 0168 D488 B0 05 BCS SPLOTB ;So move left MOS08 0165 D481 v52 MOS08 0169 D48A 20 2E D5 JSR SPB ;Plot the LH fractional byte MOS08 0165 D481 v52 MOS08 0170 D48D 90 21 BCC SPLOTE ;No complete bytes to attempt? MOS08 0165 D481 v52 MOS08 0171 D48F MOS08 0165 D481 v52 MOS08 0172 D48F 20 B4 D3 SPLOTB JSR WBDY ;Do complete bytes left MOS08 0165 D481 v52 MOS08 0173 D492 B1 D6 LDAIY ZMEMG ;(NB WBDY assumes c=1) MOS08 0165 D481 v52 MOS08 0174 D494 4D 5A 03 EOR BGCOLF MOS08 0165 D481 v52 MOS08 0175 D497 85 DA STA ZTEMP MOS08 0165 D481 v52 MOS08 0176 D499 D0 12 BNE SPLOTD ;Not a complete byte of b/g? MOS08 0165 D481 v52 MOS08 0177 D49B 38 SEC ;Go for next byte - add to pixel counter MOS08 0165 D481 v52 MOS08 0178 D49C 8A TXA MOS08 0165 D481 v52 MOS08 0179 D49D 6D 61 03 ADC NPIX MOS08 0165 D481 v52 MOS08 0180 D4A0 90 04 BCC SPLOTC MOS08 0165 D481 v52 MOS08 0181 D4A2 E6 DB INC ZTEMP+&01 ;MSB of pixel counter MOS08 0165 D481 v52 MOS08 0182 D4A4 10 07 BPL SPLOTD ;Reached margin? Then skip MOS08 0165 D481 v52 MOS08 0183 D4A6 AA SPLOTC TAX ;Not reached margin - then MOS08 0165 D481 v52 MOS08 0184 D4A7 20 16 D1 JSR PLOTFF MOS08 0165 D481 v52 MOS08 0185 D4AA 38 SEC ;carry on MOS08 0165 D481 v52 MOS08 0186 D4AB B0 E2 BCS SPLOTB ;(branch always taken). Sorry about the last comment MOS08 0165 D481 v52 MOS08 0187 D4AD MOS08 0165 D481 v52 MOS08 0188 D4AD 20 2E D5 SPLOTD JSR SPB ;Do whatever is right of the line MOS08 0165 D481 v52 MOS08 0189 D4B0 A0 00 SPLOTE LDYIM &00 ;Translate back to Ico-ords -- MOS08 0190 D4B2 20 5E D5 JSR SPU -- MOS08 0191 D4B5 -- MOS08 0192 D4B5 A0 20 LDYIM NEWPT-V ;Entry point for look for b/g colour -- MOS08 0193 D4B7 A2 24 LDXIM GCSIR-V ;Swap newpoint (in GCSIR) & calculated RH endpoint -- MOS08 0194 D4B9 20 D4 CD JSR SWAPF -- MOS08 0195 D4BC -- MOS08 0196 D4BC 20 60 D4 SCHEAT JSR SPF ;Address midpoint again held in NEWPT -- MOS08 0197 D4BF A2 04 LDXIM &04 ;Set up for plotting right -- MOS08 0198 D4C1 20 44 D5 JSR SPS ;Musn't corrupt ZTEMP -- MOS08 0199 D4C4 8A TXA ;Plot the midpoint -- MOS08 0200 D4C5 D0 02 BNE SPLOTA MOS08 0200 D4C5 v7D MOS08 0201 D4C7 C6 DB DEC ZTEMP+&01 MOS08 0200 D4C5 v7D MOS08 0202 D4C9 CA SPLOTA DEX -- MOS08 0203 D4CA -- MOS08 0204 D4CA 20 01 D5 SPLOTL JSR SPA ;Do this RH fractional byte MOS08 0213 D4DB ^6D MOS08 0205 D4CD 90 27 BCC SPLOTK ;No full bytes to attempt? MOS08 0205 D4CD v58 MOS08 0206 D4CF MOS08 0205 D4CD v58 MOS08 0207 D4CF 20 A4 D3 SPLOTI JSR EBDY ;Full bytes right MOS08 0205 D4CD v58 MOS08 0208 D4D2 B1 D6 LDAIY ZMEMG MOS08 0205 D4CD v58 MOS08 0209 D4D4 4D 5A 03 EOR BGCOLF MOS08 0205 D4CD v58 MOS08 0210 D4D7 85 DA STA ZTEMP MOS08 0205 D4CD v58 MOS08 0211 D4D9 MOS08 0205 D4CD v58 MOS08 0212 D4D9 A5 DC LDA ZTEMPB MOS08 0205 D4CD v58 MOS08 0213 D4DB D0 ED BNE SPLOTL MOS08 0205 D4CD v58 MOS08 0214 D4DD MOS08 0205 D4CD v58 MOS08 0215 D4DD A5 DA LDA ZTEMP MOS08 0205 D4CD v58 MOS08 0216 D4DF D0 12 BNE SPLOTJ ;This isn't a full byte MOS08 0205 D4CD v58 MOS08 0217 D4E1 38 SEC ;Add (NPIX)+1=no.pixels to counter MOS08 0205 D4CD v58 MOS08 0218 D4E2 8A TXA MOS08 0205 D4CD v58 MOS08 0219 D4E3 6D 61 03 ADC NPIX MOS08 0205 D4CD v58 MOS08 0220 D4E6 90 04 BCC SPLOTF MOS08 0205 D4CD v58 MOS08 0221 D4E8 E6 DB INC ZTEMP+&01 MOS08 0205 D4CD v58 MOS08 0222 D4EA 10 07 BPL SPLOTJ ;Skip if hit margin MOS08 0205 D4CD v58 MOS08 0223 D4EC AA SPLOTF TAX MOS08 0205 D4CD v58 MOS08 0224 D4ED 20 16 D1 JSR PLOTFF MOS08 0205 D4CD v58 MOS08 0225 D4F0 38 SEC MOS08 0205 D4CD v58 MOS08 0226 D4F1 B0 DC BCS SPLOTI ;(branch always taken) MOS08 0205 D4CD v58 MOS08 0227 D4F3 MOS08 0205 D4CD v58 MOS08 0228 D4F3 20 01 D5 SPLOTJ JSR SPA MOS08 0205 D4CD v58 MOS08 0229 D4F6 A0 04 SPLOTK LDYIM &04 ;Convert to address of LH endpoint -- MOS08 0230 D4F8 20 5E D5 JSR SPU -- MOS08 0231 D4FB 20 EB D0 SPLOTX JSR EMAEX ;Finished -- MOS08 0232 D4FE 4C 7D CA JMP IEG ;update external cursor -- MOS08 0233 D501 -- MOS08 0234 D501 ;SPA Plots fractional LH byte on RH line end -- MOS08 0235 D501 -- MOS08 0236 D501 A5 D1 SPA LDA ZMASK ;Push the initial combined mask -- MOS08 0237 D503 [ MOS125 = &FF -- MOS08 0239 D503 ] -- MOS08 0240 D503 18 CLC -- MOS08 0241 D504 90 0E BCC SPAF ;(branch always taken) MOS08 0241 D504 v71 MOS08 0242 D506 MOS08 0241 D504 v71 MOS08 0243 D506 68 SPAA PLA ;Try next pixel - pull combined mask MOS08 0271 D51F ^65 MOS08 0244 D507 E8 INX ;Increment the pixel counter MOS08 0271 D51F ^65 MOS08 0245 D508 D0 04 BNE SPAB MOS08 0271 D51F ^65 MOS08 0246 D50A E6 DB INC ZTEMP+&01 MOS08 0271 D51F ^65 MOS08 0247 D50C 10 16 BPL SPAE ;Exit if all pixels plotted MOS08 0271 D51F ^65 MOS08 0248 D50E 46 D1 SPAB LSR ZMASK ;Shift mask MOS08 0271 D51F ^65 MOS08 0249 D510 B0 12 BCS SPAE ;Exit if shifted out of character cell MOS08 0271 D51F ^65 MOS08 0250 D512 05 D1 ORA ZMASK ;Continue forming combined mask MOS08 0271 D51F ^65 MOS08 0251 D514 [ MOS125 = &FF MOS08 MOS08 MOS08 MOS08 Acorn macro assembler Page 36 MOS08 VDU File - MOS08 MOS08 MOS08 0271 D51F ^65 MOS08 0254 D514 | MOS08 0271 D51F ^65 MOS08 0255 D514 48 SPAF PHA ;& push it again MOS08 0271 D51F ^65 MOS08 0256 D515 A5 D1 LDA ZMASK ;START HERE MOS08 0271 D51F ^65 MOS08 0257 D517 ] MOS08 0271 D51F ^65 MOS08 0258 D517 24 DA BIT ZTEMP ;Is this pixel b/g colour ? MOS08 0271 D51F ^65 MOS08 0259 D519 MOS08 0271 D51F ^65 MOS08 0260 D519 08 PHP ;Invert z flag if needs be MOS08 0271 D51F ^65 MOS08 0261 D51A 68 PLA MOS08 0271 D51F ^65 MOS08 0262 D51B 45 DC EOR ZTEMPB ;By inverting it with ZTEMPB (0 or 2) MOS08 0271 D51F ^65 MOS08 0263 D51D [ MOS125 = &FF MOS08 0271 D51F ^65 MOS08 0268 D51D | MOS08 0271 D51F ^65 MOS08 0269 D51D 29 02 ANDIM &02 ;No shorter but saves 5 cycles and ZTEMPB can't corrupt PSR MOS08 0271 D51F ^65 MOS08 0270 D51F MOS08 0271 D51F ^65 MOS08 0271 D51F D0 E5 BNE SPAA ;Z now inverted, NE means NOT background, so loop MOS08 0247 D50C v69 MOS08 0272 D521 ] MOS08 0247 D50C v69 MOS08 0273 D521 68 PLA ;Found it?, then pull combined mask MOS08 0247 D50C v69 MOS08 0274 D522 45 D1 EOR ZMASK ;& delete this pixel from it MOS08 0247 D50C v69 MOS08 0275 D524 85 D1 SPAE STA ZMASK ;These must preserve c! MOS08 0320 D542 ^60 MOS08 0276 D526 4C 02 D1 JMP PLOT MOS08 0320 D542 ^60 MOS08 0277 D529 MOS08 0320 D542 ^60 MOS08 0278 D529 [ MOS125 = &FF MOS08 0320 D542 ^60 MOS08 0301 D529 | MOS08 0320 D542 ^60 MOS08 0302 D529 SPBD MOS08 0320 D542 ^60 MOS08 0303 D529 45 D1 EOR ZMASK MOS08 0320 D542 ^60 MOS08 0304 D52B 4A LSRA MOS08 0320 D542 ^60 MOS08 0305 D52C 90 F6 BCC SPAE ;(branch always taken) MOS08 0320 D542 ^60 MOS08 0306 D52E MOS08 0320 D542 ^60 MOS08 0307 D52E ;SPB Plots fractional RH byte on LH line end MOS08 0320 D542 ^60 MOS08 0308 D52E MOS08 0320 D542 ^60 MOS08 0309 D52E A9 00 SPB LDAIM &00 MOS08 0320 D542 ^60 MOS08 0310 D530 0A SPBE ASLA ;CC preserved via SPAE->PLOT and seen by caller MOS08 0320 D542 ^60 MOS08 0311 D531 05 D1 ORA ZMASK MOS08 0320 D542 ^60 MOS08 0312 D533 24 DA BIT ZTEMP MOS08 0320 D542 ^60 MOS08 0313 D535 D0 F2 BNE SPBD MOS08 0320 D542 ^60 MOS08 0314 D537 E8 INX MOS08 0320 D542 ^60 MOS08 0315 D538 D0 04 BNE SPBB MOS08 0320 D542 ^60 MOS08 0316 D53A E6 DB INC ZTEMP+&01 MOS08 0320 D542 ^60 MOS08 0317 D53C 10 E6 BPL SPAE MOS08 0320 D542 ^60 MOS08 0318 D53E C9 80 SPBB CMPIM &80 MOS08 0320 D542 ^60 MOS08 0319 D540 90 EE BCC SPBE MOS08 0320 D542 ^60 MOS08 0320 D542 B0 E0 BCS SPAE ;(branch always taken) -- MOS08 0321 D544 ] -- MOS08 0322 D544 -- MOS08 0323 D544 ;SPS Set up pixel counter -- MOS08 0324 D544 -- MOS08 0325 D544 BD 00 03 SPS LDAAX GWLCOL -- MOS08 0326 D547 38 SEC -- MOS08 0327 D548 ED 20 03 SBC NEWPT -- MOS08 0328 D54B A8 TAY -- MOS08 0329 D54C BD 01 03 LDAAX GWLCOL+&01 -- MOS08 0330 D54F ED 21 03 SBC NEWPT+&01 -- MOS08 0331 D552 30 03 BMI SPSA ;Ensure this is -ve MOS08 0331 D552 v7C MOS08 0332 D554 20 52 D4 JSR NEGAY MOS08 0331 D552 v7C MOS08 0333 D557 85 DB SPSA STA ZTEMP+&01 ;Store MSB -- MOS08 0334 D559 98 TYA -- MOS08 0335 D55A AA TAX ;LSB to X -- MOS08 0336 D55B 05 DB ORA ZTEMP+&01 ;Set z=1 if nothing to do -- MOS08 0337 D55D 60 RTS -- MOS08 0338 D55E -- MOS08 0339 D55E ;SPU Work out the internal co-ordinates of where we are -- MOS08 0340 D55E -- MOS08 0341 D55E 84 DA SPU STY ZTEMP -- MOS08 0342 D560 8A TXA -- MOS08 0343 D561 A8 TAY -- MOS08 0344 D562 A5 DB LDA ZTEMP+&01 -- MOS08 0345 D564 30 02 BMI SPUA ;This byte is $00 at most MOS08 0345 D564 v7D MOS08 0346 D566 A9 00 LDAIM &00 ;although it can get a $01 in it MOS08 0345 D564 v7D MOS08 0347 D568 A6 DA SPUA LDX ZTEMP -- MOS08 0348 D56A D0 03 BNE SPUB MOS08 0348 D56A v7C MOS08 0349 D56C 20 52 D4 JSR NEGAY MOS08 0348 D56A v7C MOS08 0350 D56F 48 SPUB PHA -- MOS08 0351 D570 18 CLC -- MOS08 0352 D571 98 TYA -- MOS08 0353 D572 7D 00 03 ADCAX GWLCOL -- MOS08 0354 D575 8D 20 03 STA NEWPT -- MOS08 0355 D578 68 PLA -- MOS08 0356 D579 7D 01 03 ADCAX GWLCOL+&01 -- MOS08 0357 D57C 8D 21 03 STA NEWPT+&01 -- MOS08 0358 D57F 60 RTS -- MOS08 0359 D580 -- MOS08 0360 D580 CSREAD -- MOS08 0361 D580 A9 03 LDAIM &03 ;Convert internal co-ordiantes at OLDCS & GCSIR -- MOS08 0362 D582 20 87 D5 JSR SPCA -- MOS08 0363 D585 A9 07 LDAIM &07 -- MOS08 0364 D587 48 SPCA PHA -- MOS08 0365 D588 20 D0 CD JSR SWAPB ;Swap old cursor with cursor -- MOS08 0366 D58B 20 7D CA JSR IEG ;Convert to external co-ordiantes -- MOS08 0367 D58E A2 03 LDXIM &03 ;& copy it -- MOS08 0368 D590 68 PLA -- MOS08 0369 D591 A8 TAY -- MOS08 0370 D592 BD 10 03 SPCB LDAAX GCSR MOS08 0374 D599 ^77 MOS08 0371 D595 91 F0 STAIY WARGS MOS08 0374 D599 ^77 MOS08 0372 D597 88 DEY MOS08 0374 D599 ^77 MOS08 0373 D598 CA DEX MOS08 0374 D599 ^77 MOS08 0374 D599 10 F7 BPL SPCB -- MOS08 0375 D59B 60 RTS -- MOS08 0376 D59C -- MOS08 0377 D59C LNK MOS10 -- MOS10 0001 D59C -- MOS10 0002 D59C TTL VDU File - MOS10 -- MOS10 0003 D59C OPT MOS10 MOS10 MOS10 MOS10 MOS10 Acorn macro assembler Page 37 MOS10 VDU File - MOS10 MOS10 -- MOS10 0004 D59C -- MOS10 0005 D59C ;Last revision 10/05/82 -- MOS10 0006 D59C -- MOS10 0007 D59C ;10/05/82 Save 1 byte by BCS HPLOT -> BCC TRSRTS -- MOS10 0008 D59C ;05/05/82 HPLOT uses PLOTFF -- MOS10 0009 D59C ;01/05/82 Recoded using manifests & new ordering of static variables -- MOS10 0010 D59C ;07/02/82 Zero height triangles not so disasterous (GPT) -- MOS10 0011 D59C -- MOS10 0012 D59C ;TRIANGLE PLOTTING -- MOS10 0013 D59C -- MOS10 0014 D59C ;INITIALISATION -- MOS10 0015 D59C -- MOS10 0016 D59C A2 20 EMC LDXIM NEWPT-V ;Copy new point & graphics cursor to a safe place -- MOS10 0017 D59E A0 3E LDYIM GCSTMP-V -- MOS10 0018 D5A0 20 33 D4 JSR COPY8 -- MOS10 0019 D5A3 20 ED CD JSR SORTA ;Sort into Y co-ords, in order NEWPT=Lo, GCSIR=Hi, OLDCS=Med -- MOS10 0020 D5A6 A2 14 LDXIM OLDCS-V -- MOS10 0021 D5A8 A0 24 LDYIM GCSIR-V -- MOS10 0022 D5AA 20 F1 CD JSR SORTY -- MOS10 0023 D5AD 20 ED CD JSR SORTA -- MOS10 0024 D5B0 A2 20 LDXIM NEWPT-V ;Set paramters for hypotenuse ... -- MOS10 0025 D5B2 A0 2A LDYIM HDELTA-V ;Find Deltas -- MOS10 0026 D5B4 20 C8 D3 JSR TRISA -- MOS10 0027 D5B7 AD 2B 03 LDA HDELTA+&01 ;Copy sign of DeltaX to determine direction -- MOS10 0028 D5BA 8D 32 03 STA HDIREC -- MOS10 0029 D5BD A2 28 LDXIM HPARMS -- MOS10 0030 D5BF 20 10 D4 JSR TRISB ;complete definition of hypotenuse parameters -- MOS10 0031 D5C2 A0 2E LDYIM HSTART-V ;Copy NEWPT to PStart of hypotenuse -- MOS10 0032 D5C4 20 F0 D0 JSR EMAEZ -- MOS10 0033 D5C7 ;Swap Y co-ords 2 & 3, to give 1st side -- MOS10 0034 D5C7 20 D0 CD JSR SWAPB ;Y co-ords now in order Lo, Med, Hi -- MOS10 0035 D5CA 18 CLC ;Don't plot the last line -- MOS10 0036 D5CB 20 F5 D5 JSR TRSF ;Do the lower half of the triangle -- MOS10 0037 D5CE ;Swap points to enable set up of 2nd side -- MOS10 0038 D5CE 20 D0 CD JSR SWAPB ;Y co-ords now Lo, Hi, Med -- MOS10 0039 D5D1 A2 20 LDXIM NEWPT-V ;swap Y co-ords 1 & 3 to give 2nd side -- MOS10 0040 D5D3 20 D2 CD JSR SWAPC ;& now Med, Hi, Lo -- MOS10 0041 D5D6 38 SEC ;Do plot the last line -- MOS10 0042 D5D7 20 F5 D5 JSR TRSF ;& plot the top half -- MOS10 0043 D5DA A2 3E LDXIM GCSTMP-V ;Restore original graphics cursor & new point -- MOS10 0044 D5DC A0 20 LDYIM NEWPT-V -- MOS10 0045 D5DE 20 33 D4 JSR COPY8 -- MOS10 0046 D5E1 4C EB D0 JMP EMAEX ;& do things to the cursors -- MOS10 0047 D5E4 -- MOS10 0048 D5E4 [ MOS125 = &FF -- MOS10 0059 D5E4 ] -- MOS10 0060 D5E4 -- MOS10 0061 D5E4 CSRPOS -- MOS10 0062 D5E4 AD 18 03 LDA CSX ;~~~ Read text cursor position ~~~ -- MOS10 0063 D5E7 38 SEC -- MOS10 0064 D5E8 ED 08 03 SBC TWLCOL -- MOS10 0065 D5EB AA TAX -- MOS10 0066 D5EC AD 19 03 LDA CSY -- MOS10 0067 D5EF 38 SEC -- MOS10 0068 D5F0 ED 0B 03 SBC TWTROW -- MOS10 0069 D5F3 A8 TAY -- MOS10 0070 D5F4 60 TRSRTS RTS ;No, then return MOS10 0109 D63D ^35 MOS10 0071 D5F5 MOS10 0109 D63D ^35 MOS10 0072 D5F5 ;TRSF Initialises a parameter list for ULN MOS10 0109 D63D ^35 MOS10 0073 D5F5 ;Sets up the "sides" (as opposed to the hypoteneuse) only. Skips if MOS10 0109 D63D ^35 MOS10 0074 D5F5 ;the 2 Y values are equal, otherwise calls HPLOT & ULN the requisite MOS10 0109 D63D ^35 MOS10 0075 D5F5 ;number of times MOS10 0109 D63D ^35 MOS10 0076 D5F5 ;Assumes the points forming the side to be initialised are in MOS10 0109 D63D ^35 MOS10 0077 D5F5 ;NEWPT & GCSIR MOS10 0109 D63D ^35 MOS10 0078 D5F5 MOS10 0109 D63D ^35 MOS10 0079 D5F5 08 TRSF PHP ;Push carry - is set if last line is to be plotted MOS10 0109 D63D ^35 MOS10 0080 D5F6 A2 20 LDXIM NEWPT-V ;Set up triangle parameters MOS10 0109 D63D ^35 MOS10 0081 D5F8 A0 35 LDYIM SDELTA-V ;Find deltas (sides only) MOS10 0109 D63D ^35 MOS10 0082 D5FA 20 C8 D3 JSR TRISA MOS10 0109 D63D ^35 MOS10 0083 D5FD AD 36 03 LDA SDELTA+&01 ;Find direction by sign of DeltaX MOS10 0109 D63D ^35 MOS10 0084 D600 8D 3D 03 STA SDIREC MOS10 0109 D63D ^35 MOS10 0085 D603 A2 33 LDXIM SPARMS-V ;Find MOD Deltas, and initialise L MOS10 0109 D63D ^35 MOS10 0086 D605 20 10 D4 JSR TRISB MOS10 0109 D63D ^35 MOS10 0087 D608 A0 39 LDYIM SSTART-V ;Copy NEWPT to SSTART MOS10 0109 D63D ^35 MOS10 0088 D60A 20 F0 D0 JSR EMAEZ MOS10 0109 D63D ^35 MOS10 0089 D60D 38 SEC ;How many Y values are there to be done ? MOS10 0109 D63D ^35 MOS10 0090 D60E AD 22 03 LDA NEWPT+&02 MOS10 0109 D63D ^35 MOS10 0091 D611 ED 26 03 SBC GCSIY MOS10 0109 D63D ^35 MOS10 0092 D614 8D 1B 03 STA TRINLN ;Result (2's comp.) to TRINLN MOS10 0109 D63D ^35 MOS10 0093 D617 AD 23 03 LDA NEWPT+&03 MOS10 0109 D63D ^35 MOS10 0094 D61A ED 27 03 SBC GCSIY+&01 MOS10 0109 D63D ^35 MOS10 0095 D61D 8D 1C 03 STA TRINLN+&01 ;(MSB) MOS10 0109 D63D ^35 MOS10 0096 D620 0D 1B 03 ORA TRINLN ;Anything to do? MOS10 0109 D63D ^35 MOS10 0097 D623 F0 17 BEQ TRSFA MOS10 0109 D63D ^35 MOS10 0098 D625 20 3F D6 TRSFB JSR HPLOT ;Plot the line MOS10 0109 D63D ^35 MOS10 0099 D628 A2 33 LDXIM SPARMS-V ;Move the side up MOS10 0109 D63D ^35 MOS10 0100 D62A 20 0F D7 JSR ULN MOS10 0109 D63D ^35 MOS10 0101 D62D A2 28 LDXIM HPARMS-V ;Move the hypoteneuse up MOS10 0109 D63D ^35 MOS10 0102 D62F 20 0F D7 JSR ULN MOS10 0109 D63D ^35 MOS10 0103 D632 EE 1B 03 INC TRINLN ;Any more lines ? MOS10 0109 D63D ^35 MOS10 0104 D635 D0 EE BNE TRSFB ;Yes, then loop, otherwise MOS10 0109 D63D ^35 MOS10 0105 D637 EE 1C 03 INC TRINLN+&01 MOS10 0109 D63D ^35 MOS10 0106 D63A D0 E9 BNE TRSFB MOS10 0109 D63D ^35 MOS10 0107 D63C MOS10 0109 D63D ^35 MOS10 0108 D63C 28 TRSFA PLP ;Plot the last line? MOS10 0109 D63D ^35 MOS10 0109 D63D 90 B5 BCC TRSRTS ;No, if c=0 -- MOS10 0110 D63F -- MOS10 0111 D63F ;HPLOT Fast plot of horizontal line -- MOS10 0112 D63F ;Plots horizontal line in current colour from points defined -- MOS10 0113 D63F ;at SSTART & HSTART, or, if entered at HPLOTA, from -- MOS10 0114 D63F ;GWTROW+(X) to GWTROW+(Y). -- MOS10 0115 D63F ;Y co-ordinate taken from point at (X) -- MOS10 0116 D63F -- MOS10 0117 D63F A2 39 HPLOT LDXIM SSTART-V ;Initialise point pointers -- MOS10 0118 D641 A0 2E LDYIM HSTART-V -- MOS10 0119 D643 86 DE HPLOTA STX ZTEMPC ;Store these point pointers -- MOS10 0120 D645 BD 00 03 LDAAX V ;Is x co-ord. of (X)<(Y) ? -- MOS10 0121 D648 D9 00 03 CMPAY V -- MOS10 0122 D64B BD 01 03 LDAAX V+&01 -- MOS10 0123 D64E F9 01 03 SBCAY V+&01 -- MOS10 0124 D651 30 06 BMI HPLOTB ;No, then swap (X) < = > (Y) MOS10 0124 D651 v79 MOS10 0125 D653 98 TYA MOS10 0124 D651 v79 MOS10 0126 D654 A4 DE LDY ZTEMPC MOS10 0124 D651 v79 MOS10 0127 D656 AA TAX MOS10 0124 D651 v79 MOS10 0128 D657 86 DE STX ZTEMPC MOS10 0124 D651 v79 MOS10 0129 D659 84 DF HPLOTB STY ZTEMPC +&01 -- MOS10 0130 D65B -- MOS10 0131 D65B ;ZTEMPC & X now contain the offset from V to the L.H. point -- MOS10 0132 D65B ;& ZTEMPC +01 & Y the offset from V to the R.H. point -- MOS10 0133 D65B -- MOS10 0134 D65B B9 00 03 LDAAY V ;Push R.H. x co-ordinate MOS10 MOS10 MOS10 MOS10 Acorn macro assembler Page 38 MOS10 VDU File - MOS10 MOS10 -- MOS10 0135 D65E 48 PHA -- MOS10 0136 D65F B9 01 03 LDAAY V+&01 -- MOS10 0137 D662 48 PHA -- MOS10 0138 D663 A6 DF LDX ZTEMPC +&01 ;Window the R.H. point -- MOS10 0139 D665 20 21 D1 JSR WIND -- MOS10 0140 D668 F0 0D BEQ HPLOTC ;Within window?, then plot to this point MOS10 0140 D668 v72 MOS10 0141 D66A C9 02 CMPIM &02 ;Only other allowed value of this window is 2 MOS10 0140 D668 v72 MOS10 0142 D66C D0 3D BNE HPLOTX ;Exit if this isn't =2 MOS10 0142 D66C v42 MOS10 0143 D66E A2 04 LDXIM GWRCOL-V ;It was 2?, then copy R.H. margin to x co-ord of RH point MOS10 0142 D66C v42 MOS10 0144 D670 A4 DF LDY ZTEMPC+&01 MOS10 0142 D66C v42 MOS10 0145 D672 20 39 D4 JSR COPY2 MOS10 0142 D66C v42 MOS10 0146 D675 A6 DF LDX ZTEMPC+&01 MOS10 0142 D66C v42 MOS10 0147 D677 20 F6 D7 HPLOTC JSR GADDR ;Address (modified) RH end point MOS10 0142 D66C v42 MOS10 0148 D67A A6 DE LDX ZTEMPC ;Window L.H. end point MOS10 0142 D66C v42 MOS10 0149 D67C 20 21 D1 JSR WIND MOS10 0142 D66C v42 MOS10 0150 D67F 4A LSRA ;Only allowed values of this window are 0 & 1 MOS10 0142 D66C v42 MOS10 0151 D680 D0 29 BNE HPLOTX ;Neither of those?, then exit MOS10 0142 D66C v42 MOS10 0152 D682 90 02 BCC HPLOTD ;Window was zero, then don't modify L.H. end point MOS10 0142 D66C v42 MOS10 0153 D684 A2 00 LDXIM GWLCOL-V ;L.H. endpoint was to the left of L. margin, so plot to latter MOS10 0142 D66C v42 MOS10 0154 D686 A4 DF HPLOTD LDY ZTEMPC +&01 ;Point to R.H. end point MOS10 0142 D66C v42 MOS10 0155 D688 38 SEC ;to determine no. of points needed MOS10 0142 D66C v42 MOS10 0156 D689 B9 00 03 LDAAY V ;Generate no. of points to be plotted MOS10 0142 D66C v42 MOS10 0157 D68C FD 00 03 SBCAX V MOS10 0142 D66C v42 MOS10 0158 D68F 85 DC STA ZTEMPB MOS10 0142 D66C v42 MOS10 0159 D691 B9 01 03 LDAAY V+&01 MOS10 0142 D66C v42 MOS10 0160 D694 FD 01 03 SBCAX V+&01 MOS10 0142 D66C v42 MOS10 0161 D697 85 DD STA ZTEMPB +&01 MOS10 0142 D66C v42 MOS10 0162 D699 A9 00 LDAIM &00 ;Generate the mask for the R.H. fractional byte MOS10 0142 D66C v42 MOS10 0163 D69B 0A HPLOTG ASLA MOS10 0142 D66C v42 MOS10 0164 D69C 05 D1 ORA ZMASK ;Generate R.H fractional mask MOS10 0142 D66C v42 MOS10 0165 D69E A4 DC LDY ZTEMPB MOS10 0142 D66C v42 MOS10 0166 D6A0 D0 14 BNE HPLOTE MOS10 0142 D66C v42 MOS10 0167 D6A2 C6 DD DEC ZTEMPB +&01 ;No more points to be plotted ? MOS10 0142 D66C v42 MOS10 0168 D6A4 10 10 BPL HPLOTE MOS10 0142 D66C v42 MOS10 0169 D6A6 85 D1 STA ZMASK ;No?, then plot this byte only MOS10 0142 D66C v42 MOS10 0170 D6A8 20 02 D1 JSR PLOT MOS10 0142 D66C v42 MOS10 0171 D6AB A6 DF HPLOTX LDX ZTEMPC+&01 ;Restore R.H. end point's x co-ordinate MOS10 0219 D6F2 ^37 MOS10 0172 D6AD 68 PLA MOS10 0219 D6F2 ^37 MOS10 0173 D6AE 9D 01 03 STAAX V+&01 MOS10 0219 D6F2 ^37 MOS10 0174 D6B1 68 PLA MOS10 0219 D6F2 ^37 MOS10 0175 D6B2 9D 00 03 STAAX V MOS10 0219 D6F2 ^37 MOS10 0176 D6B5 60 RTS MOS10 0219 D6F2 ^37 MOS10 0177 D6B6 C6 DC HPLOTE DEC ZTEMPB MOS10 0219 D6F2 ^37 MOS10 0178 D6B8 AA TAX ;Continue with generation of R.H. fractional byte mask MOS10 0219 D6F2 ^37 MOS10 0179 D6B9 10 E0 BPL HPLOTG ;until b7 of this mask is set, whence is the mask complete MOS10 0219 D6F2 ^37 MOS10 0180 D6BB 85 D1 STA ZMASK MOS10 0219 D6F2 ^37 MOS10 0181 D6BD 20 02 D1 JSR PLOT ;Plot R.H. fractional byte MOS10 0219 D6F2 ^37 MOS10 0182 D6C0 A6 DC LDX ZTEMPB ;LSB of no. points to be plotted, excl RH fractional byte MOS10 0219 D6F2 ^37 MOS10 0183 D6C2 E8 INX ;Increment this, for no. points is inclusive MOS10 0219 D6F2 ^37 MOS10 0184 D6C3 D0 02 BNE HPLOTL MOS10 0219 D6F2 ^37 MOS10 0185 D6C5 E6 DD INC ZTEMPB +&01 MOS10 0219 D6F2 ^37 MOS10 0186 D6C7 8A HPLOTL TXA MOS10 0219 D6F2 ^37 MOS10 0187 D6C8 48 PHA ;Needed for the determination of the LH fractional byte MOS10 0219 D6F2 ^37 MOS10 0188 D6C9 46 DD LSR ZTEMPB +&01 ;Divide no. points by no.pixels to give no. bytes MOS10 0219 D6F2 ^37 MOS10 0189 D6CB 6A RORA MOS10 0219 D6F2 ^37 MOS10 0190 D6CC AC 61 03 LDY NPIX MOS10 0219 D6F2 ^37 MOS10 0191 D6CF C0 03 CPYIM &03 MOS10 0219 D6F2 ^37 MOS10 0192 D6D1 F0 05 BEQ HPLOTP MOS10 0219 D6F2 ^37 MOS10 0193 D6D3 90 04 BCC HPLOTQ MOS10 0219 D6F2 ^37 MOS10 0194 D6D5 46 DD LSR ZTEMPB +&01 ;y>3, i.e 8 pixels per byte MOS10 0219 D6F2 ^37 MOS10 0195 D6D7 6A RORA MOS10 0219 D6F2 ^37 MOS10 0196 D6D8 [ MOS125 = &FF MOS10 0219 D6F2 ^37 MOS10 0198 D6D8 | MOS10 0219 D6F2 ^37 MOS10 0199 D6D8 HPLOTP ;y=3, i.e. 4 pixels per byte MOS10 0219 D6F2 ^37 MOS10 0200 D6D8 ;ZTEMPB +&01 dead; C dead as A must not exceed &4F MOS10 0219 D6F2 ^37 MOS10 0201 D6D8 ] MOS10 0219 D6F2 ^37 MOS10 0202 D6D8 4A LSRA MOS10 0219 D6F2 ^37 MOS10 0203 D6D9 AC 1A 03 HPLOTQ LDY YLINE ;Prepare ye the way of the loop MOS10 0219 D6F2 ^37 MOS10 0204 D6DC AA TAX ;Contains the nuber of complete bytes to be filled in MOS10 0219 D6F2 ^37 MOS10 0205 D6DD F0 0F BEQ HPLOTF ;None?, then skip to plotting of L.H. fractional byte MOS10 0219 D6F2 ^37 MOS10 0206 D6DF MOS10 0219 D6F2 ^37 MOS10 0207 D6DF 98 HPLOTI TYA ;MAIN FULL BYTE LOOP MOS10 0219 D6F2 ^37 MOS10 0208 D6E0 38 SEC ;Move Y back 8 bytes MOS10 0219 D6F2 ^37 MOS10 0209 D6E1 E9 08 SBCIM &08 MOS10 0219 D6F2 ^37 MOS10 0210 D6E3 A8 TAY MOS10 0219 D6F2 ^37 MOS10 0211 D6E4 B0 02 BCS HPLOTH ;Carry generated? MOS10 0219 D6F2 ^37 MOS10 0212 D6E6 C6 D7 DEC ZMEMG +&01 ;Yes?, then decrement MSB of IY vector MOS10 0219 D6F2 ^37 MOS10 0213 D6E8 20 16 D1 HPLOTH JSR PLOTFF ;Plot the bugger ! MOS10 0219 D6F2 ^37 MOS10 0214 D6EB CA DEX ;Any more ? MOS10 0219 D6F2 ^37 MOS10 0215 D6EC D0 F1 BNE HPLOTI ;Yes, then loop again MOS10 0219 D6F2 ^37 MOS10 0216 D6EE MOS10 0219 D6F2 ^37 MOS10 0217 D6EE 68 HPLOTF PLA ;Pull the LSB of the number of points to plotted MOS10 0219 D6F2 ^37 MOS10 0218 D6EF 2D 61 03 AND NPIX ;No. of points in L.H. fractional byte MOS10 0219 D6F2 ^37 MOS10 0219 D6F2 F0 B7 BEQ HPLOTX ;Leave if nothing to do -- MOS10 0220 D6F4 AA TAX ;Generate the mask for the LH fractional byte -- MOS10 0221 D6F5 A9 00 LDAIM &00 -- MOS10 0222 D6F7 0A HPLOTJ ASLA MOS10 0225 D6FC ^79 MOS10 0223 D6F8 0D 63 03 ORA MASKR MOS10 0225 D6FC ^79 MOS10 0224 D6FB CA DEX MOS10 0225 D6FC ^79 MOS10 0225 D6FC D0 F9 BNE HPLOTJ -- MOS10 0226 D6FE 85 D1 STA ZMASK -- MOS10 0227 D700 98 TYA -- MOS10 0228 D701 38 SEC ;Move Y back 8 bytes again -- MOS10 0229 D702 E9 08 SBCIM &08 -- MOS10 0230 D704 A8 TAY -- MOS10 0231 D705 B0 02 BCS HPLOTK ;Carry generated MOS10 0231 D705 v7D MOS10 0232 D707 C6 D7 DEC ZMEMG +&01 ;Yes?, then decrement MSB of IY vector MOS10 0231 D705 v7D MOS10 0233 D709 20 05 D1 HPLOTK JSR PLOTS ;Plot the L.H. fractional byte -- MOS10 0234 D70C 4C AB D6 JMP HPLOTX -- MOS10 0235 D70F -- MOS10 0236 D70F ;ULN Increments the current graphics line which is drawing the triangle -- MOS10 0237 D70F ;It varies the X points according to the values of the MOD deltas, and -- MOS10 0238 D70F ;the direction byte. -- MOS10 0239 D70F ;As input, it requires in X the offset of the parameter list from V. -- MOS10 0240 D70F ;The parameter list is assumed to be in the following order : -- MOS10 0241 D70F ;Bytes 0-1 "L", the variable used in determining the steps left/right -- MOS10 0242 D70F ;Bytes 2-3 MOD Delta X -- MOS10 0243 D70F ;Bytes 4-5 MOD Delta Y -- MOS10 0244 D70F ;Bytes 6-9 Point from which the line is to be drawn (XL,XH,YL,YH) -- MOS10 0245 D70F ;Byte A Direction - +ve if x increasing as Y does, else -ve -- MOS10 0246 D70F -- MOS10 0247 D70F FE 08 03 ULN INCAX V+&08 ;Increment Y value of point to be drawn from/to -- MOS10 0248 D712 D0 03 BNE ULNA MOS10 0248 D712 v7C MOS10 0249 D714 FE 09 03 INCAX V+&09 MOS10 0248 D712 v7C MOS10 0250 D717 38 ULNA SEC ;L := L - MOD(DeltaX) -- MOS10 0251 D718 BD 00 03 LDAAX V -- MOS10 0252 D71B FD 02 03 SBCAX V+&02 -- MOS10 0253 D71E 9D 00 03 STAAX V -- MOS10 0254 D721 BD 01 03 LDAAX V+&01 -- MOS10 0255 D724 FD 03 03 SBCAX V+&03 -- MOS10 0256 D727 9D 01 03 STAAX V+&01 MOS10 MOS10 MOS10 MOS10 Acorn macro assembler Page 39 MOS10 VDU File - MOS10 MOS10 -- MOS10 0257 D72A 10 2F BPL ULNB ;+ve?, then skip the move X part following MOS10 0257 D72A v50 MOS10 0258 D72C [ MOS125 = &FF MOS10 0257 D72A v50 MOS10 0270 D72C | MOS10 0257 D72A v50 MOS10 0271 D72C 18 ULNF CLC MOS10 0257 D72A v50 MOS10 0272 D72D BD 0A 03 LDAAX V+&0A ;Move X, which direction ? MOS10 0257 D72A v50 MOS10 0273 D730 30 0A BMI ULNC ;Skip if move left MOS10 0257 D72A v50 MOS10 0274 D732 FE 06 03 INCAX V+&06 ;Move right, therefore increment the X value MOS10 0257 D72A v50 MOS10 0275 D735 D0 10 BNE ULND MOS10 0257 D72A v50 MOS10 0276 D737 FE 07 03 INCAX V+&07 MOS10 0257 D72A v50 MOS10 0277 D73A 90 0B BCC ULND ;always branch MOS10 0257 D72A v50 MOS10 0278 D73C BD 06 03 ULNC LDAAX V+&06 ;Move left, therefore decrement X value MOS10 0257 D72A v50 MOS10 0279 D73F D0 03 BNE ULNE MOS10 0257 D72A v50 MOS10 0280 D741 DE 07 03 DECAX V+&07 MOS10 0257 D72A v50 MOS10 0281 D744 DE 06 03 ULNE DECAX V+&06 MOS10 0257 D72A v50 MOS10 0282 D747 ULND ;L := L + MOD DeltaY MOS10 0257 D72A v50 MOS10 0283 D747 ] MOS10 0257 D72A v50 MOS10 0284 D747 BD 00 03 LDAAX V MOS10 0257 D72A v50 MOS10 0285 D74A 7D 04 03 ADCAX V+&04 MOS10 0257 D72A v50 MOS10 0286 D74D 9D 00 03 STAAX V MOS10 0257 D72A v50 MOS10 0287 D750 BD 01 03 LDAAX V+&01 MOS10 0257 D72A v50 MOS10 0288 D753 7D 05 03 ADCAX V+&05 MOS10 0257 D72A v50 MOS10 0289 D756 9D 01 03 STAAX V+&01 MOS10 0257 D72A v50 MOS10 0290 D759 30 D1 BMI ULNF ;Move left/right again ? TRAP HORIZONTAL LINES BEFORE !! MOS10 0257 D72A v50 MOS10 0291 D75B 60 ULNB RTS -- MOS10 0292 D75C LNK MOS11 -- MOS11 0001 D75C -- MOS11 0002 D75C TTL VDU File - MOS11 -- MOS11 0003 D75C OPT MOS11 MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 40 MOS11 VDU File - MOS11 MOS11 -- MOS11 0004 D75C -- MOS11 0005 D75C ;Last revision 05/05/82 -- MOS11 0006 D75C -- MOS11 0007 D75C ;05/05/82 Move GADDR here. Change to tabke with 1 entry only -- MOS11 0008 D75C ;01/05/82 Recoded to account for new ordering of variables -- MOS11 0009 D75C ;24/04/82 READCH returns mode in Y, char. in X (AGAIN!) -- MOS11 0010 D75C ;19/04/82 Improved exit at RPXLC -- MOS11 0011 D75C ;16/04/82 improved READCH code -- MOS11 0012 D75C ;25/03/82 Change order of READCH character search -- MOS11 0013 D75C ;22/01/82 Change EIG to EIGABS for READPX -- MOS11 0014 D75C ;07/01/82 Rewrite READCH for non-TTX (GPT) -- MOS11 0015 D75C ;16/11/81 Fix to READCH change (15/11) -- MOS11 0016 D75C ;15/11/81 READCH returns mode in Y, char. in X -- MOS11 0017 D75C ;09/11/81 (Paul) Read start of VDU space coping with model A -- MOS11 0018 D75C -- MOS11 0019 D75C ;READCH Reads the character at the current cursor location, -- MOS11 0020 D75C ;returning the result in A. -- MOS11 0021 D75C ;If the character is not found, 0 is returned. -- MOS11 0022 D75C ;Assumes new font splitting, using FNTFLG & PGSFNT -- MOS11 0023 D75C -- MOS11 0024 D75C READCH -- MOS11 0025 D75C AC 60 03 LDY NCOLOR ;Is it TTX? -- MOS11 0026 D75F D0 0D BNE READCE MOS11 0026 D75F v72 MOS11 0027 D761 B1 D8 LDAIY ZMEMT ;Yes, then read character direct (Y=0) MOS11 0026 D75F v72 MOS11 0028 D763 [ MOS125 = &FF MOS11 0026 D75F v72 MOS11 0036 D763 | MOS11 0026 D75F v72 MOS11 0037 D763 ;CS from OSB or RDCHK->RDCHGY->COPYCH MOS11 0026 D75F v72 MOS11 0038 D763 ;(or RDCHGS->GKEY..RDCHGY->COPYCH after hacking) MOS11 0026 D75F v72 MOS11 0039 D763 ;SEC ;transform only MOS11 0026 D75F v72 MOS11 0040 D763 20 F0 CF JSR TTXFRM ;convert ASCII to Teletext MOS11 0026 D75F v72 MOS11 0041 D766 20 F0 CF JSR TTXFRM ;and again to convert Teletext to ASCII MOS11 0026 D75F v72 MOS11 0042 D769 ] MOS11 0026 D75F v72 MOS11 0043 D769 AC 55 03 READKE LDY MODE ;Only way of getting the mode MOS11 0091 D78B ^5C MOS11 0044 D76C AA TAX MOS11 0091 D78B ^5C MOS11 0045 D76D 60 RTS MOS11 0091 D78B ^5C MOS11 0046 D76E MOS11 0091 D78B ^5C MOS11 0047 D76E MOS11 0091 D78B ^5C MOS11 0048 D76E [ MOS125 = &FF MOS11 0091 D78B ^5C MOS11 0074 D76E | MOS11 0091 D78B ^5C MOS11 0075 D76E 20 99 D7 READCE JSR PTCNV ;Get the bit pattern to READWS MOS11 0091 D78B ^5C MOS11 0076 D771 A2 20 LDXIM &20 ;First character to be checked MOS11 0091 D78B ^5C MOS11 0077 D773 8A READKF TXA ;Address charcter MOS11 0098 D797 ^5A MOS11 0078 D774 F0 F3 BEQ READKE ;Finished search? MOS11 0098 D797 ^5A MOS11 0079 D776 48 PHA MOS11 0098 D797 ^5A MOS11 0080 D777 20 50 D0 JSR CHADDR ;Result to ZTEMPC MOS11 0098 D797 ^5A MOS11 0081 D77A 68 PLA MOS11 0098 D797 ^5A MOS11 0082 D77B AA TAX MOS11 0098 D797 ^5A MOS11 0083 D77C A0 07 READKA LDYIM &07 ;Compare this character MOS11 0098 D797 ^5A MOS11 0084 D77E B9 28 03 READKB LDAAY READWS ;Get bit pattern MOS11 0098 D797 ^5A MOS11 0085 D781 D1 DE CMPIY ZTEMPC ;Compare with font MOS11 0098 D797 ^5A MOS11 0086 D783 D0 08 BNE READKC ;Different?, then not this character MOS11 0098 D797 ^5A MOS11 0087 D785 88 DEY ;Same?, then look at next row down MOS11 0098 D797 ^5A MOS11 0088 D786 10 F6 BPL READKB MOS11 0098 D797 ^5A MOS11 0089 D788 8A TXA MOS11 0098 D797 ^5A MOS11 0090 D789 E0 7F CPXIM &7F ;Is it a DEL? MOS11 0098 D797 ^5A MOS11 0091 D78B D0 DC BNE READKE ;No?, then you have found it MOS11 0098 D797 ^5A MOS11 0092 D78D E8 READKC INX ;Next character up MOS11 0098 D797 ^5A MOS11 0093 D78E A5 DE LDA ZTEMPC ;LSB of font pointer up by 8 MOS11 0098 D797 ^5A MOS11 0094 D790 18 CLC MOS11 0098 D797 ^5A MOS11 0095 D791 69 08 ADCIM &08 MOS11 0098 D797 ^5A MOS11 0096 D793 85 DE STA ZTEMPC MOS11 0098 D797 ^5A MOS11 0097 D795 D0 E5 BNE READKA ;More on this page? MOS11 0098 D797 ^5A MOS11 0098 D797 F0 DA BEQ READKF ;(branch always taken) -- MOS11 0099 D799 ] -- MOS11 0100 D799 -- MOS11 0101 D799 ;Converts the 8,16 or 32 byte character on the screen to an 8 byte -- MOS11 0102 D799 ;bit pattern in Q .. Q+07. Not very fast, in particular, the 8 byte -- MOS11 0103 D799 ;version could be speeded up. Background text colour is recognized -- MOS11 0104 D799 ;as 'background', even if cursors are joined. Anything else is -- MOS11 0105 D799 ;recognised as 'foreground' -- MOS11 0106 D799 -- MOS11 0107 D799 ;ZTEMP is the row number (7..0) -- MOS11 0108 D799 ;ZTEMP +01 is he bit pattern being formed from this row -- MOS11 0109 D799 ;ZTEMPB is the mask being used to isolate the current pixel -- MOS11 0110 D799 -- MOS11 0111 D799 A0 07 PTCNV LDYIM &07 ;The row to be converted -- MOS11 0112 D79B 84 DA PTCNVA STY ZTEMP ;Start of 'convert 1 row' loop MOS11 0157 D7CB ^4E MOS11 0113 D79D A9 01 LDAIM &01 ;The bit pattern to be formed MOS11 0157 D7CB ^4E MOS11 0114 D79F 85 DB STA ZTEMP +&01 ;Finshed when a carry shifted out MOS11 0157 D7CB ^4E MOS11 0115 D7A1 [ MOS125 = &FF MOS11 0157 D7CB ^4E MOS11 0128 D7A1 | MOS11 0157 D7CB ^4E MOS11 0129 D7A1 ;Adds 4 bytes but OS 1.25 gets them anyway MOS11 0157 D7CB ^4E MOS11 0130 D7A1 ;to avoid diverging from 1.26 before GADDR MOS11 0157 D7CB ^4E MOS11 0131 D7A1 CD 63 03 CMP MASKR ;C=0 if >1bpp MOS11 0157 D7CB ^4E MOS11 0132 D7A4 AD 62 03 PTCNVB LDA MASKL ;Isolates the pixel to be tested in the current byte MOS11 0157 D7CB ^4E MOS11 0133 D7A7 85 DC STA ZTEMPB ;Must move to next byte when carry shifted out left MOS11 0157 D7CB ^4E MOS11 0134 D7A9 B1 D8 LDAIY ZMEMT ;Get the byte to be tested MOS11 0157 D7CB ^4E MOS11 0135 D7AB 4D 58 03 EOR BTCOLF ;Isolate back from foreground MOS11 0157 D7CB ^4E MOS11 0136 D7AE B0 17 BCS PTCNVF ;Write byte directly if 1bpp MOS11 0157 D7CB ^4E MOS11 0137 D7B0 24 DC PTCNVC BIT ZTEMPB ;Are any of the bits in this pixel set ? MOS11 0157 D7CB ^4E MOS11 0138 D7B2 F0 01 BEQ PTCNVD ;No?, then this pixel was background MOS11 0157 D7CB ^4E MOS11 0139 D7B4 38 SEC ;Yes?, then it was foreground MOS11 0157 D7CB ^4E MOS11 0140 D7B5 26 DB PTCNVD ROL ZTEMP +&01 ;Shift this bit into the bit pattern MOS11 0157 D7CB ^4E MOS11 0141 D7B7 66 DC ROR ZTEMPB ;Isolate the next pixel MOS11 0157 D7CB ^4E MOS11 0142 D7B9 90 F5 BCC PTCNVC ;carry clear, then continue MOS11 0157 D7CB ^4E MOS11 0143 D7BB 30 06 BMI PTCNVE ;pattern overflow?, then this pattern is complete MOS11 0157 D7CB ^4E MOS11 0144 D7BD ] MOS11 0157 D7CB ^4E MOS11 0145 D7BD 98 TYA ;c=1, then examine the next byte in the row MOS11 0157 D7CB ^4E MOS11 0146 D7BE 69 07 ADCIM &07 ;(c=1), by adding 8 to Y MOS11 0157 D7CB ^4E MOS11 0147 D7C0 A8 TAY MOS11 0157 D7CB ^4E MOS11 0148 D7C1 90 E1 BCC PTCNVB ;and continue (branch always taken) MOS11 0157 D7CB ^4E MOS11 0149 D7C3 A4 DA PTCNVE LDY ZTEMP ;Restore Y MOS11 0157 D7CB ^4E MOS11 0150 D7C5 A5 DB LDA ZTEMP +&01 ;bit pattern finished, store it in the READWS MOS11 0157 D7CB ^4E MOS11 0151 D7C7 [ MOS125 = &FF MOS11 0157 D7CB ^4E MOS11 0152 D7C7 | MOS11 0157 D7CB ^4E MOS11 0153 D7C7 PTCNVF MOS11 0157 D7CB ^4E MOS11 0154 D7C7 ] MOS11 0157 D7CB ^4E MOS11 0155 D7C7 99 28 03 STAAY READWS MOS11 0157 D7CB ^4E MOS11 0156 D7CA 88 DEY ;& do the next row up MOS11 0157 D7CB ^4E MOS11 0157 D7CB 10 CE BPL PTCNVA -- MOS11 0158 D7CD 60 RTS ;or return -- MOS11 0159 D7CE -- MOS11 0160 D7CE ;RPXL Reads the pixel at V+(A), -- MOS11 0161 D7CE ;returning $FF if the cursor is out of the window, else the logical -- MOS11 0162 D7CE ;colour at the cursor. -- MOS11 0163 D7CE ;Assumes the current cursor in internal representation is GCSIY... -- MOS11 0164 D7CE -- MOS11 0165 D7CE 48 RPXLD PHA -- MOS11 0166 D7CF AA TAX ;Convert to Ico-ords -- MOS11 0167 D7D0 20 5B D1 JSR EIGABS -- MOS11 0168 D7D3 68 PLA MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 41 MOS11 VDU File - MOS11 MOS11 -- MOS11 0169 D7D4 AA TAX -- MOS11 0170 D7D5 20 F1 D7 JSR GADDV -- MOS11 0171 D7D8 D0 12 BNE RPXLC ;Out of window?, then return $FF. MOS11 0171 D7D8 v6D MOS11 0172 D7DA B1 D6 LDAIY ZMEMG MOS11 0171 D7D8 v6D MOS11 0173 D7DC [ MOS125 = &FF MOS11 0171 D7D8 v6D MOS11 0183 D7DC | MOS11 0171 D7D8 v6D MOS11 0184 D7DC 85 DA STA ZTEMP MOS11 0171 D7D8 v6D MOS11 0185 D7DE B0 01 RPXLA BCS RPXLB ;kick the bit out again if it wasn't relevant MOS11 0171 D7D8 v6D MOS11 0186 D7E0 4A LSRA MOS11 0171 D7D8 v6D MOS11 0187 D7E1 06 DA RPXLB ASL ZTEMP ;Shift out the leftmost bit MOS11 0171 D7D8 v6D MOS11 0188 D7E3 2A ROLA ;& shift into the byte to receive the pixel's logical colour MOS11 0171 D7D8 v6D MOS11 0189 D7E4 06 D1 ASL ZMASK ;unless the bit was irrelevant MOS11 0171 D7D8 v6D MOS11 0190 D7E6 D0 F6 BNE RPXLA ;Have we finished ? MOS11 0171 D7D8 v6D MOS11 0191 D7E8 ] MOS11 0171 D7D8 v6D MOS11 0192 D7E8 2D 60 03 AND NCOLOR MOS11 0171 D7D8 v6D MOS11 0193 D7EB 60 RTS ;& finish MOS11 0171 D7D8 v6D MOS11 0194 D7EC A9 FF RPXLC LDAIM &FF ;Return $FF if point was outside graphics window -- MOS11 0195 D7EE 60 RPXLX RTS ;& finish MOS11 0201 D7F4 ^78 MOS11 0196 D7EF MOS11 0201 D7F4 ^78 MOS11 0197 D7EF ;Window a point, & plot if in window MOS11 0201 D7F4 ^78 MOS11 0198 D7EF MOS11 0201 D7F4 ^78 MOS11 0199 D7EF A2 20 GADDW LDXIM NEWPT-V ;Do this for new point MOS11 0201 D7F4 ^78 MOS11 0200 D7F1 20 21 D1 GADDV JSR WIND ;Do this for general point. Is it in window ? MOS11 0201 D7F4 ^78 MOS11 0201 D7F4 D0 F8 BNE RPXLX ;No, then skip the windowing -- MOS11 0202 D7F6 -- MOS11 0203 D7F6 ;otherwise fall through to ... -- MOS11 0204 D7F6 -- MOS11 0205 D7F6 ;GADDR Addresses a single pixel on the graphics screen -- MOS11 0206 D7F6 ;Results are not guaranteed unless point is on screen -- MOS11 0207 D7F6 ;Requires :- -- MOS11 0208 D7F6 ;(X) = offset from V of point to be addressed. -- MOS11 0209 D7F6 ;Format of the pointed at point is INTERNAL co-ords, non-inverted Y axis -- MOS11 0210 D7F6 ;with 4 bytes of XL,XH,YL,YH. -- MOS11 0211 D7F6 ;ZTBL points to row offset table as per character writing -- MOS11 0212 D7F6 ;TOPSCN as usual. -- MOS11 0213 D7F6 ;NPIX = No. pixles per byte -- MOS11 0214 D7F6 ;Wraparound may occur on ends of lines only, thus hardware must display -- MOS11 0215 D7F6 ;ALL the characters in the display area (OK for modes as proposed). -- MOS11 0216 D7F6 ;Sets the following variables -- MOS11 0217 D7F6 ;YLINE = line offset within character cell (0..7) -- MOS11 0218 D7F6 ;ZMEMG = 1st byte of character cell -- MOS11 0219 D7F6 ;ZMASK = mask -- MOS11 0220 D7F6 -- MOS11 0221 D7F6 BD 02 03 GADDR LDAAX V+&02 ;(Y,LSB) MSB assumed 0 -- MOS11 0222 D7F9 49 FF EORIM &FF ;Invert Y axis -- MOS11 0223 D7FB A8 TAY -- MOS11 0224 D7FC 29 07 ANDIM &07 ;Get YLINE = 3 least significant bits of Y -- MOS11 0225 D7FE 8D 1A 03 STA YLINE -- MOS11 0226 D801 98 TYA -- MOS11 0227 D802 4A LSRA ;Get twice the character row (for 2 byte entry lookup table) -- MOS11 0228 D803 4A LSRA -- MOS11 0229 D804 4A LSRA -- MOS11 0230 D805 0A ASLA ;c=0 guaranteed (better than AND $FE : CLC) -- MOS11 0231 D806 A8 TAY ;Character row offset -- MOS11 0232 D807 B1 E0 LDAIY ZTBL ;Add row offset to TOPSCN -- MOS11 0233 D809 85 DA STA ZTEMP ;MSB -- MOS11 0234 D80B C8 INY -- MOS11 0235 D80C B1 E0 LDAIY ZTBL ;LSB -- MOS11 0236 D80E AC 56 03 LDY MEMODE -- MOS11 0237 D811 F0 03 BEQ GADDRD ; Divide by 2 if 10K mode (can only be 0 or 2) MOS11 0237 D811 v7C MOS11 0238 D813 46 DA LSR ZTEMP MOS11 0237 D811 v7C MOS11 0239 D815 6A RORA MOS11 0237 D811 v7C MOS11 0240 D816 6D 50 03 GADDRD ADC TOPSCN ;c=0 guaranteed before this add -- MOS11 0241 D819 85 D6 STA ZMEMG -- MOS11 0242 D81B A5 DA LDA ZTEMP -- MOS11 0243 D81D 6D 51 03 ADC TOPSCN+&01 -- MOS11 0244 D820 85 D7 STA ZMEMG +&01 -- MOS11 0245 D822 -- MOS11 0246 D822 ;Now calculate the X offset -- MOS11 0247 D822 -- MOS11 0248 D822 BD 01 03 LDAAX V+&01 ;(MSB,X) -- MOS11 0249 D825 85 DA STA ZTEMP -- MOS11 0250 D827 BD 00 03 LDAAX V ;(LSB,X) -- MOS11 0251 D82A 48 PHA ;Push the LSB of the X co-ordinate -- MOS11 0252 D82B 2D 61 03 AND NPIX ;Calc. ZMASK (NB, c=0 from prev. addition) -- MOS11 0253 D82E 6D 61 03 ADC NPIX ;This gives the correct starting position -- MOS11 0254 D831 A8 TAY ;within the table, plus 1 -- MOS11 0255 D832 B9 06 C4 LDAAY MASKTB-&01 ;So compensate by subtracting one here -- MOS11 0256 D835 85 D1 STA ZMASK -- MOS11 0257 D837 68 PLA ;Retrieve the LSB of X co-ordinate -- MOS11 0258 D838 AC 61 03 LDY NPIX -- MOS11 0259 D83B C0 03 CPYIM &03 ;Divide by NPIX, and mult. by 8 -- MOS11 0260 D83D F0 05 BEQ GADDRA ;4 pixles/byte - mult. by 2 MOS11 0260 D83D v7A MOS11 0261 D83F B0 06 BCS GADDRB ;8 pixles/byte - don't do anything MOS11 0261 D83F v79 MOS11 0262 D841 0A ASLA ;2 pixles per byte - mult. by 4 MOS11 0261 D83F v79 MOS11 0263 D842 26 DA ROL ZTEMP MOS11 0261 D83F v79 MOS11 0264 D844 0A GADDRA ASLA MOS11 0261 D83F v79 MOS11 0265 D845 26 DA ROL ZTEMP MOS11 0261 D83F v79 MOS11 0266 D847 29 F8 GADDRB ANDIM &F8 ;Ignore any low order bits -- MOS11 0267 D849 18 CLC ;Calculate the final address, LSB 1st -- MOS11 0268 D84A 65 D6 ADC ZMEMG -- MOS11 0269 D84C 85 D6 STA ZMEMG -- MOS11 0270 D84E A5 DA LDA ZTEMP -- MOS11 0271 D850 65 D7 ADC ZMEMG +&01 -- MOS11 0272 D852 10 04 BPL GADDRC ;Skip wraparound if < $8000 MOS11 0272 D852 v7B MOS11 0273 D854 38 SEC ;Correct by subtracting off screen if it is MOS11 0272 D852 v7B MOS11 0274 D855 ED 54 03 SBC BYTSCN MOS11 0272 D852 v7B MOS11 0275 D858 85 D7 GADDRC STA ZMEMG +&01 ;Store final address, MSB -- MOS11 0276 D85A AC 1A 03 LDY YLINE -- MOS11 0277 D85D A9 00 COPYZX LDAIM &00 ;Sets z=1 MOS11 0314 D89D ^3E MOS11 0278 D85F 60 RTS MOS11 0314 D89D ^3E MOS11 0279 D860 MOS11 0314 D89D ^3E MOS11 0280 D860 ;VDUB for cursor control keys MOS11 0314 D89D ^3E MOS11 0281 D860 MOS11 0314 D89D ^3E MOS11 0282 D860 VDUB MOS11 0314 D89D ^3E MOS11 0283 D860 48 PHA MOS11 0314 D89D ^3E MOS11 0284 D861 A9 A0 LDAIM &A0 ;To see if the cursors are joined or drivers disabled when BIT is done MOS11 0314 D89D ^3E MOS11 0285 D863 AE 6A 02 LDX QPOSN ;Qing bytes ? MOS11 0314 D89D ^3E MOS11 0286 D866 D0 40 BNE VDUBEX ;Yes?, then ignore this MOS11 0314 D89D ^3E MOS11 0287 D868 24 D0 BIT STATS ;Are the drivers enabled ? MOS11 0314 D89D ^3E MOS11 0288 D86A D0 3C BNE VDUBEX ;Leave if not, or cursors joined MOS11 0314 D89D ^3E MOS11 0289 D86C 70 19 BVS VDUBA ;Are we in cursor edit mode ? Yes?, then skip MOS11 0314 D89D ^3E MOS11 0290 D86E AD 5F 03 LDA CSTEMP ;Flash the cursor at twice the rate MOS11 0314 D89D ^3E MOS11 0291 D871 29 9F ANDIM &9F ;Sets b5=0, b6=1 of r10 of 6845, giving fast flashing cursor MOS11 0314 D89D ^3E MOS11 0292 D873 09 40 ORAIM &40 MOS11 0314 D89D ^3E MOS11 0293 D875 20 2A C9 JSR ETCB ;Store in r10 of 6845, don't save to CSTEMP MOS11 0314 D89D ^3E MOS11 0294 D878 A2 18 LDXIM CSX-V ;Set b1 of STATS or store CSX to PCSX MOS11 0314 D89D ^3E MOS11 0295 D87A A0 64 LDYIM PCSX-V MOS11 0314 D89D ^3E MOS11 0296 D87C 20 39 D4 JSR COPY2 MOS11 0314 D89D ^3E MOS11 0297 D87F 20 70 CD JSR OCSRWR ;Print the output cursor MOS11 0314 D89D ^3E MOS11 0298 D882 A9 02 LDAIM &02 ;Set b1 of STATS MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 42 MOS11 VDU File - MOS11 MOS11 MOS11 0314 D89D ^3E MOS11 0299 D884 20 9C C5 JSR STTOR MOS11 0314 D89D ^3E MOS11 0300 D887 A9 BF VDUBA LDAIM &BF ;Clear b6 of STATS MOS11 0314 D89D ^3E MOS11 0301 D889 20 A7 C5 JSR STTAND MOS11 0314 D89D ^3E MOS11 0302 D88C 68 PLA ;Restore input character to routine MOS11 0314 D89D ^3E MOS11 0303 D88D 29 7F ANDIM &7F ;Kill the parity bit MOS11 0314 D89D ^3E MOS11 0304 D88F 20 C0 C4 JSR VDU ;Execute cursor movement on input cursor MOS11 0314 D89D ^3E MOS11 0305 D892 A9 40 LDAIM &40 ;Set b6 of STATS MOS11 0314 D89D ^3E MOS11 0306 D894 4C 9C C5 JMP STTOR MOS11 0314 D89D ^3E MOS11 0307 D897 MOS11 0314 D89D ^3E MOS11 0308 D897 ;Copy key in cursor editing MOS11 0314 D89D ^3E MOS11 0309 D897 MOS11 0314 D89D ^3E MOS11 0310 D897 COPYCH MOS11 0314 D89D ^3E MOS11 0311 D897 A9 20 LDAIM &20 ;Cursors joined ? MOS11 0314 D89D ^3E MOS11 0312 D899 24 D0 BIT STATS MOS11 0314 D89D ^3E MOS11 0313 D89B 50 C0 BVC COPYZX ;Not C.E. mode, then do nothing MOS11 0314 D89D ^3E MOS11 0314 D89D D0 BE BNE COPYZX ;Cursors joined, so do nothing MOS11 0286 D866 v3F MOS11 0315 D89F 20 5C D7 JSR READCH ;Read character at cursor position MOS11 0286 D866 v3F MOS11 0316 D8A2 F0 05 BEQ COPYCX ;Not recognised?, then exit with no further action MOS11 0286 D866 v3F MOS11 0317 D8A4 48 PHA ;Move input cursor right MOS11 0286 D866 v3F MOS11 0318 D8A5 20 63 C6 JSR HT ;But with no scrolling MOS11 0286 D866 v3F MOS11 0319 D8A8 68 VDUBEX PLA MOS11 0316 D8A2 v7A MOS11 0320 D8A9 60 COPYCX RTS -- MOS11 0321 D8AA -- MOS11 0322 D8AA ;CSEDEX Finish cursor edit mode -- MOS11 0323 D8AA -- MOS11 0324 D8AA A9 BD CSEDEX LDAIM &BD ;Clear b1 & b6 from STATS -- MOS11 0325 D8AC 20 A7 C5 JSR STTAND -- MOS11 0326 D8AF 20 27 C9 JSR ETCA ;Restore cursor from CSTEMP to r10 of 6845 -- MOS11 0327 D8B2 A9 0D LDAIM TRMCH ;Restore (A) -- MOS11 0328 D8B4 60 RTS -- MOS11 0329 D8B5 -- MOS11 0330 D8B5 TOPCMD -- MOS11 0331 D8B5 AE 55 03 LDX MODE ;~~~ Beginning of screen memory ~~~ -- MOS11 0332 D8B8 -- MOS11 0333 D8B8 ;& fall through to .... -- MOS11 0334 D8B8 -- MOS11 0335 D8B8 TOPMDX -- MOS11 0336 D8B8 8A TXA ;Don't trust (X) anymore .... -- MOS11 0337 D8B9 29 07 ANDIM &07 -- MOS11 0338 D8BB A8 TAY -- MOS11 0339 D8BC ; read VDU low water mark for mode Y -- MOS11 0340 D8BC BE 40 C4 LDXAY MODETB ;~~~ Read beginning of memory for mode (Y) ~~~ -- MOS11 0341 D8BF BD 5E C4 LDAAX STSCTB ;A := hi-byte of lwm address -- MOS11 0342 D8C2 A2 00 LDXIM &00 ;Used later -- MOS11 0343 D8C4 ; check model type -- MOS11 0344 D8C4 2C 8E 02 BIT MODEL -- MOS11 0345 D8C7 30 07 BMI PRBB1 ;[model B, all modes permissable] MOS11 0345 D8C7 v78 MOS11 0346 D8C9 ; model A MOS11 0345 D8C7 v78 MOS11 0347 D8C9 ; return HWM of zero for modes 0 to 3 MOS11 0345 D8C7 v78 MOS11 0348 D8C9 ; (cos they require between 16K and 20K) MOS11 0345 D8C7 v78 MOS11 0349 D8C9 29 3F ANDIM &3F ;correct for 16K m/c (model A) MOS11 0345 D8C7 v78 MOS11 0350 D8CB C0 04 CPYIM &04 ;fault modes<=3 on model A MOS11 0345 D8C7 v78 MOS11 0351 D8CD B0 01 BCS PRBB1 ;[mode>=4] MOS11 0345 D8C7 v78 MOS11 0352 D8CF 8A TXA ;model A and mode<=3. Sets (A):=0 MOS11 0345 D8C7 v78 MOS11 0353 D8D0 PRBB1 ;return low water mark MOS11 0345 D8C7 v78 MOS11 0354 D8D0 A8 TAY -- MOS11 0355 D8D1 60 RTS -- MOS11 0356 D8D2 -- MOS11 0357 D8D2 ENDVDU ;end of VDU code -- MOS11 0358 D8D2 ; Now test code layout for correctness -- MOS11 0359 D8D2 -- MOS11 0360 D8D2 0000 T1 * SOH:SHR:&8-CODORG:SHR:&3 -- MOS11 0361 D8D2 0000 T2 * DCA:SHR:&8-CODORG:SHR:&3 -- MOS11 0362 D8D2 0000 T3 * DCB:SHR:&8-CODORG:SHR:&3 -- MOS11 0363 D8D2 0000 T4 * DCC:SHR:&8-CODORG:SHR:&3 -- MOS11 0364 D8D2 0000 T5 * SYN:SHR:&8-CODORG:SHR:&3 -- MOS11 0365 D8D2 0000 T6 * ETB:SHR:&8-CODORG:SHR:&3 -- MOS11 0366 D8D2 0000 T7 * CAN:SHR:&8-CODORG:SHR:&3 -- MOS11 0367 D8D2 0000 T8 * EM:SHR:&8-CODORG:SHR:&3 -- MOS11 0368 D8D2 0000 T9 * FS:SHR:&8-CODORG:SHR:&3 -- MOS11 0369 D8D2 0000 TA * GS:SHR:&8-CODORG:SHR:&3 -- MOS11 0370 D8D2 0000 TB * US:SHR:&8-CODORG:SHR:&3 -- MOS11 0371 D8D2 [ T1=0 -- MOS11 0372 D8D2 | -- MOS11 0374 D8D2 ] -- MOS11 0375 D8D2 [ T2=0 -- MOS11 0376 D8D2 | -- MOS11 0378 D8D2 ] -- MOS11 0379 D8D2 [ T3=0 -- MOS11 0380 D8D2 | -- MOS11 0382 D8D2 ] -- MOS11 0383 D8D2 [ T4=0 -- MOS11 0384 D8D2 | -- MOS11 0386 D8D2 ] -- MOS11 0387 D8D2 [ T5=0 -- MOS11 0388 D8D2 | -- MOS11 0390 D8D2 ] -- MOS11 0391 D8D2 [ T6=0 -- MOS11 0392 D8D2 | -- MOS11 0394 D8D2 ] -- MOS11 0395 D8D2 [ T7=0 -- MOS11 0396 D8D2 | -- MOS11 0398 D8D2 ] -- MOS11 0399 D8D2 [ T8=0 -- MOS11 0400 D8D2 | -- MOS11 0402 D8D2 ] -- MOS11 0403 D8D2 [ T9=0 -- MOS11 0404 D8D2 | -- MOS11 0406 D8D2 ] -- MOS11 0407 D8D2 [ TA=0 -- MOS11 0408 D8D2 | -- MOS11 0410 D8D2 ] -- MOS11 0411 D8D2 [ TB=0 -- MOS11 0412 D8D2 | -- MOS11 0414 D8D2 ] -- MOS11 0415 D8D2 -- MOS11 0416 D8D2 00C3 TC * HRGTB:SHR: 8 -- MOS11 0417 D8D2 00C3 TD * TXTTB:SHR: 8 -- MOS11 0418 D8D2 [ TC-TD=0 -- MOS11 0419 D8D2 | -- MOS11 0421 D8D2 ] -- MOS11 0422 D8D2 -- MOS11 0423 D8D2 00CC TE * CLASCA:SHR: 8 -- MOS11 0424 D8D2 00CC TF * CLASCE:SHR: 8 -- MOS11 0425 D8D2 -- MOS11 0426 D8D2 [ TE-TF=0 -- MOS11 0427 D8D2 | -- MOS11 0429 D8D2 ] -- MOS11 0430 D8D2 -- MOS11 0431 D8D2 OPT OPPON -- MOS11 0432 D8D2 < 3 MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 43 MOS11 VDU File - MOS11 MOS11 -- MOS11 0433 D8D2 -- MOS11 0434 D8D2 LNK MOS30 -- MOS30 0001 D8D2 ; MOS30 -- MOS30 0002 D8D2 OPT &01 -- MOS30 0003 D8D2 TTL MOS30 Manifests -- MOS30 0004 D8D2 -- MOS30 0005 D8D2 ;Change record: -- MOS30 0006 D8D2 -- MOS30 0007 D8D2 -- MOS30 0008 D8D2 < &0003 -- MOS30 0009 D8D2 > &0002 -- MOS30 0010 D8D2 -- MOS30 0011 D8D2 -- MOS30 0012 D8D2 -- MOS30 0013 D8D2 -- MOS30 0014 D8D2 ; module print selections -- MOS30 0015 D8D2 ; -- MOS30 0016 D8D2 0005 MOS30 * DEFOPT -- MOS30 0017 D8D2 0005 MOS32 * DEFOPT -- MOS30 0018 D8D2 0005 MOS34 * DEFOPT -- MOS30 0019 D8D2 0005 MOS36 * DEFOPT -- MOS30 0020 D8D2 0005 MOS38 * DEFOPT -- MOS30 0021 D8D2 0005 MOS39 * DEFOPT -- MOS30 0022 D8D2 0005 MOS40 * DEFOPT -- MOS30 0023 D8D2 0005 MOS42 * DEFOPT -- MOS30 0024 D8D2 0005 MOS44 * DEFOPT -- MOS30 0025 D8D2 0005 MOS46 * DEFOPT -- MOS30 0026 D8D2 0005 MOS48 * DEFOPT -- MOS30 0027 D8D2 -- MOS30 0028 D8D2 0005 MOS52 * DEFOPT -- MOS30 0029 D8D2 0005 MOS54 * DEFOPT -- MOS30 0030 D8D2 0005 MOS56 * DEFOPT -- MOS30 0031 D8D2 -- MOS30 0032 D8D2 0005 MOS99 * DEFOPT -- MOS30 0033 D8D2 -- MOS30 0034 D8D2 -- MOS30 0035 D8D2 OPT MOS30 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 44 MOS30 MOS30 Manifests MOS30 -- MOS30 0036 D8D2 ;(c) 1981 ACORN Computers Limited -- MOS30 0037 D8D2 ;BBC Microcomputer Machine Operating System (MOS) -- MOS30 0038 D8D2 ;Change record: -- MOS30 0039 D8D2 ;Author(s): -- MOS30 0040 D8D2 ;PB Paul Bond -- MOS30 0041 D8D2 ;MP Mike Prees -- MOS30 0042 D8D2 -- MOS30 0043 D8D2 -- MOS30 0044 D8D2 ; version number -- MOS30 0045 D8D2 ; -- MOS30 0046 D8D2 0001 MCVER * &01 ;OS binary version number -- MOS30 0047 D8D2 0031 VERA * "1" -- MOS30 0048 D8D2 0032 VERB * "2" -- MOS30 0049 D8D2 [ MOS125 = &FF -- MOS30 0051 D8D2 ] -- MOS30 0052 D8D2 [ MOS125 = &7F -- MOS30 0053 D8D2 0036 VERC * "6" -- MOS30 0054 D8D2 ] -- MOS30 0055 D8D2 [ MOS125 = &00 -- MOS30 0057 D8D2 ] -- MOS30 0058 D8D2 -- MOS30 0059 D8D2 -- MOS30 0060 D8D2 ; composition -- MOS30 0061 D8D2 ; -- MOS30 0062 D8D2 0000 TRUE * &00 ;for conditional assembly -- MOS30 0063 D8D2 00FF FALSE * &FF ;for conditional assembly -- MOS30 0064 D8D2 -- MOS30 0065 D8D2 -- MOS30 0066 D8D2 ; options -- MOS30 0067 D8D2 ; -- MOS30 0068 D8D2 0000 INKYSW * TRUE -- MOS30 0069 D8D2 -- MOS30 0070 D8D2 -- MOS30 0071 D8D2 ; VDU software interface -- MOS30 0072 D8D2 ; -- MOS30 0073 D8D2 C300 VDUORG * &C300 ;VDU software module origin -- MOS30 0074 D8D2 C300 VDINIT * VDUORG +&00 ;initialise RAM and VDU -- MOS30 0075 D8D2 D8D2 ORIGIN * ENDVDU -- MOS30 0076 D8D2 -- MOS30 0077 D8D2 -- MOS30 0078 D8D2 ; tube interface -- MOS30 0079 D8D2 ; -- MOS30 0080 D8D2 ^ &0400 -- MOS30 0081 D8D2 0400 TBLANG # &03 ;enter language -- MOS30 0082 D8D2 0403 TBESC # &03 ;alter escape condition -- MOS30 0083 D8D2 0406 TBADDR # &03 ;address translation -- MOS30 0084 D8D2 -- MOS30 0085 D8D2 -- MOS30 0086 D8D2 -- MOS30 0087 D8D2 ; error codes -- MOS30 0088 D8D2 -- MOS30 0089 D8D2 ; special reports -- MOS30 0090 D8D2 ; -- MOS30 0091 D8D2 -- MOS30 0092 D8D2 -- MOS30 0093 D8D2 -- MOS30 0094 D8D2 ; infamous BASIC error number assignment boob -- MOS30 0095 D8D2 ; -- MOS30 0096 D8D2 -- MOS30 0097 D8D2 -- MOS30 0098 D8D2 -- MOS30 0099 D8D2 ; MOS errors -- MOS30 0100 D8D2 ; -- MOS30 0101 D8D2 -- MOS30 0102 D8D2 -- MOS30 0103 D8D2 -- MOS30 0104 D8D2 ; $FF is reserved for a non-trappable error in future systems -- MOS30 0105 D8D2 ; -- MOS30 0106 D8D2 00FE BADCMD * &FE ;'Bad command' -- MOS30 0107 D8D2 00FD BADST * &FD ;'Bad string' -- MOS30 0108 D8D2 00FC BADADR * &FC ;'Bad address' -- MOS30 0109 D8D2 00FB BADKY * &FB ;'Bad key' -- MOS30 0110 D8D2 00FA KEYUSE * &FA ;'Key in use' -- MOS30 0111 D8D2 00F9 NOLROM * &F9 ;'No language ROM' -- MOS30 0112 D8D2 00F8 NOFSYS * &F8 ;'No filing system' -- MOS30 0113 D8D2 00F7 FX0MSG * &F7 ;operating system version number -- MOS30 0114 D8D2 -- MOS30 0115 D8D2 -- MOS30 0116 D8D2 ; file system control operations -- MOS30 0117 D8D2 ; -- MOS30 0118 D8D2 0000 FSOPT * &00 ;*OPT x,y value assumed by FX code -- MOS30 0119 D8D2 0001 FSEOF * &01 ;EOF#chan value assumed by FX code -- MOS30 0120 D8D2 0002 FSNOTA * &02 ;*non-alpha -- MOS30 0121 D8D2 0003 FSNAME * &03 ;*name -- MOS30 0122 D8D2 0004 FSRUN * &04 ;*RUN name -- MOS30 0123 D8D2 0005 FSCAT * &05 ;*CAT name -- MOS30 0124 D8D2 0006 FSDIE * &06 ;kill filing system -- MOS30 0125 D8D2 0007 FSHRNG * &07 ;return handle range in X (lo) and Y (hi) -- MOS30 0126 D8D2 -- MOS30 0127 D8D2 0008 FSCLI * &08 ;*command encountered -- MOS30 0128 D8D2 -- MOS30 0129 D8D2 -- MOS30 0130 D8D2 ; user print operations -- MOS30 0131 D8D2 ; -- MOS30 0132 D8D2 0000 UPTIME * &00 ;timer interrupt -- MOS30 0133 D8D2 0001 UPWRCH * &01 ;write character -- MOS30 0134 D8D2 ; return C=0 => printer busy, C=1 => printer free -- MOS30 0135 D8D2 -- MOS30 0136 D8D2 -- MOS30 0137 D8D2 -- MOS30 0138 D8D2 -- MOS30 0139 D8D2 ; NET operations -- MOS30 0140 D8D2 ; -- MOS30 0141 D8D2 ; hi-level -- MOS30 0142 D8D2 ; -- MOS30 0143 D8D2 ; VALUES $01-$03,$05 RESERVED FOR PRINTER INTERFACE -- MOS30 0144 D8D2 0004 NTWRCH * &04 ;WRCH -- MOS30 0145 D8D2 0006 NTRDCH * &06 ;RDCH -- MOS30 0146 D8D2 -- MOS30 0147 D8D2 0008 NTWORD * &08 ;OSWORD call (c.f. SVWORD) -- MOS30 0148 D8D2 -- MOS30 0149 D8D2 -- MOS30 0150 D8D2 -- MOS30 0151 D8D2 ; service ROM operations -- MOS30 0152 D8D2 ; -- MOS30 0153 D8D2 0010 NROM * &0010 ;number of paged ROMs -- MOS30 0154 D8D2 -- MOS30 0155 D8D2 0000 SVNOP * &00 ;no operation -- MOS30 0156 D8D2 0001 SVSTAT * &01 ;offer static allocation -- MOS30 0157 D8D2 0002 SVDYN * &02 ;offer dynamic allocation -- MOS30 0158 D8D2 0003 SVBOOT * &03 ;offer bootstrap MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 45 MOS30 MOS30 Manifests MOS30 -- MOS30 0159 D8D2 0004 SVNAME * &04 ;offer command -- MOS30 0160 D8D2 0005 SVINT * &05 ;unknown interrupt -- MOS30 0161 D8D2 0006 SVBRK * &06 ;offer BRK -- MOS30 0162 D8D2 0007 SVBYTE * &07 ;offer bad OSBYTE (N.B. also NTxxxx code) -- MOS30 0163 D8D2 0008 SVWORD * &08 ;offer bad OSWORD (N.B. also NTxxxx code) -- MOS30 0164 D8D2 ; -- MOS30 0165 D8D2 [ FALSE=0 -- MOS30 0167 D8D2 | -- MOS30 0168 D8D2 0009 SVHELP * &09 ;*HELP facility -- MOS30 0169 D8D2 ] -- MOS30 0170 D8D2 ; -- MOS30 0171 D8D2 000A SVCSHR * &0A ;claim shared workspace -- MOS30 0172 D8D2 000B SVRNMI * &0B ;release NMI -- MOS30 0173 D8D2 000C SVCNMI * &0C ;claim NMI -- MOS30 0174 D8D2 000D SVISFS * &0D ;initialise speech filing system -- MOS30 0175 D8D2 000E SVRSFS * &0E ;read from speech filing system -- MOS30 0176 D8D2 000F SVFSIC * &0F ;changed filing system indirections -- MOS30 0177 D8D2 -- MOS30 0178 D8D2 0010 SVSHES * &10 ;shut EXEC and SPOOL files -- MOS30 0179 D8D2 0011 SVHWMC * &11 ;change of HWM ******** DO NOT CHANGE ******** -- MOS30 0180 D8D2 0012 SVSTFS * &12 ;start filing system N -- MOS30 0181 D8D2 00FE SVTPIN * &FE ;tube post-initialisation **** VALUE ASSUMED BY RESET **** -- MOS30 0182 D8D2 00FF SVTUBE * &FF ;initialise tube software -- MOS30 0183 D8D2 -- MOS30 0184 D8D2 -- MOS30 0185 D8D2 ; language entry reasons -- MOS30 0186 D8D2 ; -- MOS30 0187 D8D2 0000 LGNONE * &00 ;no language ROM (tube entry reason) -- MOS30 0188 D8D2 0001 LGENTR * &01 ;enter language -- MOS30 0189 D8D2 -- MOS30 0190 D8D2 -- MOS30 0191 D8D2 ; RS423 transmitter control bits -- MOS30 0192 D8D2 ; -- MOS30 0193 D8D2 0000 RHITXD * &00 ;RTS hi, Tx interrupt disabled -- MOS30 0194 D8D2 0020 RHITXE * &20 ;RTS hi, Tx interrupt enabled -- MOS30 0195 D8D2 0040 RLOTXD * &40 ;RTS lo, Tx interrupt disabled -- MOS30 0196 D8D2 0060 RHITXB * &60 ;RTS hi, Tx break -- MOS30 0197 D8D2 0056 RSCDEF * &16+RLOTXD ;Rx interrupt disabled ... -- MOS30 0198 D8D2 ; ... RTS lo, Tx interrupt disabled, divide by 64, 8 data bits, 1 stop bit -- MOS30 0199 D8D2 -- MOS30 0200 D8D2 -- MOS30 0201 D8D2 ; speech processor opcodes -- MOS30 0202 D8D2 ; -- MOS30 0203 D8D2 0010 SPOPRB * &10 ;read byte -- MOS30 0204 D8D2 0060 SPOPSE * &60 ;speak external -- MOS30 0205 D8D2 0030 SPOPBR * &30 ;read and branch -- MOS30 0206 D8D2 0040 SPOPLA * &40 ;load address -- MOS30 0207 D8D2 0050 SPOPSP * &50 ;speak -- MOS30 0208 D8D2 00FF SPOPRT * &FF ;reset -- MOS30 0209 D8D2 -- MOS30 0210 D8D2 -- MOS30 0211 D8D2 ; memory map assignments -- MOS30 0212 D8D2 ; -- MOS30 0213 D8D2 FC00 FRED * &FC00 -- MOS30 0214 D8D2 FCFF MEG1P * &FCFF ;1MHz bus page selector -- MOS30 0215 D8D2 FD00 JIM * &FD00 -- MOS30 0216 D8D2 FE00 SHEIL * &FE00 -- MOS30 0217 D8D2 FE08 ACIA * &FE08 -- MOS30 0218 D8D2 FE10 SERPRC * &FE10 ;serial processor -- MOS30 0219 D8D2 -- MOS30 0220 D8D2 FE20 VPROC0 * &FE20 ;video processor -- MOS30 0221 D8D2 FE21 VPROC1 * VPROC0 +&01 -- MOS30 0222 D8D2 FE20 STNID * &FE20 ;ECONET station identifier -- MOS30 0223 D8D2 FE30 ROM * &FE30 ;ROM select latch -- MOS30 0224 D8D2 FE40 VIAA * &FE40 ;first 6522 -- MOS30 0225 D8D2 FE60 VIAB * &FE60 ;second 6522 -- MOS30 0226 D8D2 -- MOS30 0227 D8D2 -- MOS30 0228 D8D2 ; analog to digital converter -- MOS30 0229 D8D2 ; -- MOS30 0230 D8D2 FEC0 ADCONV * &FEC0 -- MOS30 0231 D8D2 FEC0 ADCCTL * ADCONV +&00 -- MOS30 0232 D8D2 FEC1 ADCHI * ADCONV +&01 -- MOS30 0233 D8D2 FEC2 ADCLO * ADCONV +&02 -- MOS30 0234 D8D2 -- MOS30 0235 D8D2 -- MOS30 0236 D8D2 ; tube register(s) -- MOS30 0237 D8D2 ; -- MOS30 0238 D8D2 FEE0 TREG0 * &FEE0 -- MOS30 0239 D8D2 FEE5 TREG3 * &FEE5 -- MOS30 0240 D8D2 -- MOS30 0241 D8D2 -- MOS30 0242 D8D2 -- MOS30 0243 D8D2 ; test software indirection -- MOS30 0244 D8D2 ; -- MOS30 0245 D8D2 FDFE TSTSFT * &FDFE -- MOS30 0246 D8D2 -- MOS30 0247 D8D2 -- MOS30 0248 D8D2 ; language ROM address -- MOS30 0249 D8D2 ; -- MOS30 0250 D8D2 8000 LANG * &8000 -- MOS30 0251 D8D2 8000 ROMHRD * LANG +&00 ;hard ROM entry point -- MOS30 0252 D8D2 8003 ROMSFT * LANG +&03 ;soft ROM entry point -- MOS30 0253 D8D2 -- MOS30 0254 D8D2 8006 ROMTYP * LANG +&06 ;ROM type -- MOS30 0255 D8D2 8007 COPYRP * LANG +&07 ;relative offset (from LANG) to copyright string -- MOS30 0256 D8D2 8008 ROMVER * LANG +&08 ;version byte -- MOS30 0257 D8D2 8009 ROMMSG * LANG +&09 ;name -- MOS30 0258 D8D2 -- MOS30 0259 D8D2 -- MOS30 0260 D8D2 ; miscellaneous constants -- MOS30 0261 D8D2 ; -- MOS30 0262 D8D2 0000 ZERO * &00 -- MOS30 0263 D8D2 0000 NULL * ZERO ;don't care value -- MOS30 0264 D8D2 0020 SPACE * &20 -- MOS30 0265 D8D2 0040 AT * &40 -- MOS30 0266 D8D2 0041 ALPHAA * "A" -- MOS30 0267 D8D2 0022 DQUOTE * """" -- MOS30 0268 D8D2 002A SPLAT * "*" -- MOS30 0269 D8D2 0060 POUND * &60 -- MOS30 0270 D8D2 -- MOS30 0271 D8D2 -- MOS30 0272 D8D2 -- MOS30 0273 D8D2 0007 BEL * &07 -- MOS30 0274 D8D2 -- MOS30 0275 D8D2 0009 MHT * &09 -- MOS30 0276 D8D2 0009 TAB * MHT -- MOS30 0277 D8D2 000A MLF * &0A -- MOS30 0278 D8D2 000D MCR * &0D -- MOS30 0279 D8D2 0015 MNAK * &15 -- MOS30 0280 D8D2 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 46 MOS30 MOS30 Manifests MOS30 -- MOS30 0281 D8D2 001B ESC * &1B -- MOS30 0282 D8D2 007F MDEL * &7F -- MOS30 0283 D8D2 -- MOS30 0284 D8D2 -- MOS30 0285 D8D2 ; real softkeys -- MOS30 0286 D8D2 ; -- MOS30 0287 D8D2 0080 SOFTK0 * &0080 ;f0 (value must NOT be altered) -- MOS30 0288 D8D2 0081 SOFTK1 * SOFTK0 +&01 ;f1 -- MOS30 0289 D8D2 0082 SOFTK2 * SOFTK1 +&01 ;f2 -- MOS30 0290 D8D2 0083 SOFTK3 * SOFTK2 +&01 ;f3 -- MOS30 0291 D8D2 0084 SOFTK4 * SOFTK3 +&01 ;f4 -- MOS30 0292 D8D2 0085 SOFTK5 * SOFTK4 +&01 ;f5 -- MOS30 0293 D8D2 0086 SOFTK6 * SOFTK5 +&01 ;f6 -- MOS30 0294 D8D2 0087 SOFTK7 * SOFTK6 +&01 ;f7 -- MOS30 0295 D8D2 0088 SOFTK8 * SOFTK7 +&01 ;f8 -- MOS30 0296 D8D2 0089 SOFTK9 * SOFTK8 +&01 ;f9 -- MOS30 0297 D8D2 -- MOS30 0298 D8D2 -- MOS30 0299 D8D2 ; pseudo softkeys, including cursor controls -- MOS30 0300 D8D2 ; -- MOS30 0301 D8D2 008A SOFTKA * SOFTK9 +&01 -- MOS30 0302 D8D2 008B SOFTKB * SOFTKA +&01 ;COPY -- MOS30 0303 D8D2 008B MCOPY * SOFTKB -- MOS30 0304 D8D2 008C SOFTKC * SOFTKB +&01 ;cursor left arrow -- MOS30 0305 D8D2 008C CURLFT * SOFTKC -- MOS30 0306 D8D2 008D SOFTKD * SOFTKC +&01 ;cursor right arrow -- MOS30 0307 D8D2 008D CURRHT * SOFTKD -- MOS30 0308 D8D2 008E SOFTKE * SOFTKD +&01 ;cursor down -- MOS30 0309 D8D2 008E CURDWN * SOFTKE -- MOS30 0310 D8D2 008F SOFTKF * SOFTKE +&01 ;cursor up -- MOS30 0311 D8D2 008F CURUP * SOFTKF -- MOS30 0312 D8D2 00BF MAXSK * &BF ;maximum value of SHIFT/CTRL softkey code -- MOS30 0313 D8D2 00CA BREKEY * &CA ;softkey 10 feature -- MOS30 0314 D8D2 -- MOS30 0315 D8D2 -- MOS30 0316 D8D2 ; default auto-repeat rates -- MOS30 0317 D8D2 ; -- MOS30 0318 D8D2 0032 DAUTOD * 50 ;delay (centiseconds) -- MOS30 0319 D8D2 0008 DAUTOP * 8 ;period (centiseconds) -- MOS30 0320 D8D2 -- MOS30 0321 D8D2 -- MOS30 0322 D8D2 ; default RS423 baud rates -- MOS30 0323 D8D2 ; -- MOS30 0324 D8D2 0064 B9600 * &64 ;Tx9600 and Rx9600 -- MOS30 0325 D8D2 -- MOS30 0326 D8D2 -- MOS30 0327 D8D2 ; RS423 printer timeout period -- MOS30 0328 D8D2 ; -- MOS30 0329 D8D2 00E7 PTIMUT * &E7 ;(-) 25/50 second -- MOS30 0330 D8D2 -- MOS30 0331 D8D2 -- MOS30 0332 D8D2 ; OS constants -- MOS30 0333 D8D2 0E00 OSHWM * &0E00 ;default high water mark -- MOS30 0334 D8D2 0D00 NMI * &0D00 -- MOS30 0335 D8D2 -- MOS30 0336 D8D2 -- MOS30 0337 D8D2 ; buffer indices -- MOS30 0338 D8D2 ; -- MOS30 0339 D8D2 0000 BRDCH * &0000 ;RDCH (keyboard) -- MOS30 0340 D8D2 0001 BRSI * &0001 ;RS423 input -- MOS30 0341 D8D2 0001 INPUT * BRSI -- MOS30 0342 D8D2 0002 BRSO * &0002 ;RS423 output -- MOS30 0343 D8D2 0002 OUTPUT * BRSO -- MOS30 0344 D8D2 0003 BPRNT * &0003 ;print -- MOS30 0345 D8D2 0004 BSND1 * &0004 ;sound channel 1 -- MOS30 0346 D8D2 0005 BSND2 * BSND1+&1 ;sound channel 2 -- MOS30 0347 D8D2 0006 BSND3 * BSND2+&1 ;sound channel 3 -- MOS30 0348 D8D2 0007 BSND4 * BSND3+&1 ;sound channel 4 -- MOS30 0349 D8D2 0008 BSPCH * BSND4+&1 ;speech -- MOS30 0350 D8D2 0008 BUPB * BSPCH -- MOS30 0351 D8D2 -- MOS30 0352 D8D2 -- MOS30 0353 D8D2 ; keyboard status bits -- MOS30 0354 D8D2 ; -- MOS30 0355 D8D2 0008 SHFT * &08 ;SHIFT active -- MOS30 0356 D8D2 0010 CAPSL * &10 ;not CAPITALS lock -- MOS30 0357 D8D2 0020 SHFTL * &20 ;not SHIFT lock -- MOS30 0358 D8D2 0040 CTRL * &40 ;CTRL active -- MOS30 0359 D8D2 0080 INVERT * &80 ;SHIFT enable -- MOS30 0360 D8D2 00B7 CTLSHI * &B7 ;inverted (CTRL and SHIFT status bits) -- MOS30 0361 D8D2 -- MOS30 0362 D8D2 -- MOS30 0363 D8D2 ; keyboard matrix element values -- MOS30 0364 D8D2 ; -- MOS30 0365 D8D2 00C0 CPLKKY * &C0 ;CAPITALS lock key -- MOS30 0366 D8D2 00D0 SHLKKY * &D0 ;SHIFT lock key -- MOS30 0367 D8D2 -- MOS30 0368 D8D2 -- MOS30 0369 D8D2 ; FX numbers -- MOS30 0370 D8D2 ; -- MOS30 0371 D8D2 0088 FXCODE * &88 -- MOS30 0372 D8D2 0089 FXMOTR * &89 -- MOS30 0373 D8D2 008B FXOPT * &8B -- MOS30 0374 D8D2 008C FXTAPE * &8C -- MOS30 0375 D8D2 008D FXSROM * &8D -- MOS30 0376 D8D2 0090 FXTV * &90 -- MOS30 0377 D8D2 -- MOS30 0378 D8D2 -- MOS30 0379 D8D2 ; MC6850 addresses -- MOS30 0380 D8D2 ; -- MOS30 0381 D8D2 FE08 RSCTL * ACIA -- MOS30 0382 D8D2 FE08 RSTAT * ACIA -- MOS30 0383 D8D2 FE09 RSDATA * ACIA +&01 -- MOS30 0384 D8D2 -- MOS30 0385 D8D2 -- MOS30 0386 D8D2 ; miscellaneous -- MOS30 0387 D8D2 ; -- MOS30 0388 D8D2 0004 NADC * &04 ;number of ADC channels -- MOS30 0389 D8D2 -- MOS30 0390 D8D2 -- MOS30 0391 D8D2 ; 6522 addresses -- MOS30 0392 D8D2 ; -- MOS30 0393 D8D2 FE40 PBQ * VIAA -- MOS30 0394 D8D2 FE41 PAQ * VIAA +&01 -- MOS30 0395 D8D2 FE42 DDRBQ * VIAA +&02 -- MOS30 0396 D8D2 FE43 DDRAQ * VIAA +&03 -- MOS30 0397 D8D2 FE44 TQCLQ * VIAA +&04 -- MOS30 0398 D8D2 FE45 TQCHQ * VIAA +&05 -- MOS30 0399 D8D2 FE46 TQLLQ * VIAA +&06 -- MOS30 0400 D8D2 FE47 TQLHQ * VIAA +&07 -- MOS30 0401 D8D2 FE48 TRCLQ * VIAA +&08 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 47 MOS30 MOS30 Manifests MOS30 -- MOS30 0402 D8D2 FE49 TRCHQ * VIAA +&09 -- MOS30 0403 D8D2 FE4A SRQ * VIAA +&0A -- MOS30 0404 D8D2 FE4B ACRQ * VIAA +&0B -- MOS30 0405 D8D2 FE4C PCRQ * VIAA +&0C -- MOS30 0406 D8D2 000A CAPULS * &0A -- MOS30 0407 D8D2 000C CA2LO * &0C -- MOS30 0408 D8D2 000E CA2HI * &0E -- MOS30 0409 D8D2 00A0 CBPULS * &A0 -- MOS30 0410 D8D2 00C0 CB2LO * &C0 -- MOS30 0411 D8D2 00E0 CB2HI * &E0 -- MOS30 0412 D8D2 FE4D IFRQ * VIAA +&0D -- MOS30 0413 D8D2 FE4E IERQ * VIAA +&0E -- MOS30 0414 D8D2 FE4F PAPQ * VIAA +&0F -- MOS30 0415 D8D2 FE60 PBR * VIAB -- MOS30 0416 D8D2 FE61 PAR * VIAB +&01 -- MOS30 0417 D8D2 FE62 DDRBR * VIAB +&02 -- MOS30 0418 D8D2 FE63 DDRAR * VIAB +&03 -- MOS30 0419 D8D2 FE64 TQCLR * VIAB +&04 -- MOS30 0420 D8D2 FE65 TQCHR * VIAB +&05 -- MOS30 0421 D8D2 FE66 TQLLR * VIAB +&06 -- MOS30 0422 D8D2 FE67 TQLHR * VIAB +&07 -- MOS30 0423 D8D2 FE68 TRCLR * VIAB +&08 -- MOS30 0424 D8D2 FE69 TRCHR * VIAB +&09 -- MOS30 0425 D8D2 FE6A SRR * VIAB +&0A -- MOS30 0426 D8D2 FE6B ACRR * VIAB +&0B -- MOS30 0427 D8D2 FE6C PCRR * VIAB +&0C -- MOS30 0428 D8D2 FE6D IFRR * VIAB +&0D -- MOS30 0429 D8D2 FE6E IERR * VIAB +&0E -- MOS30 0430 D8D2 FE6F PAPR * VIAB +&0F -- MOS30 0431 D8D2 -- MOS30 0432 D8D2 -- MOS30 0433 D8D2 ; interrupt flags in 6522 IER and IFR -- MOS30 0434 D8D2 ; -- MOS30 0435 D8D2 0002 CA1 * &0002 -- MOS30 0436 D8D2 0001 CA2 * &0001 -- MOS30 0437 D8D2 0010 CB1 * &0010 -- MOS30 0438 D8D2 0008 CB2 * &0008 -- MOS30 0439 D8D2 0040 TIMER1 * &0040 -- MOS30 0440 D8D2 0020 TIMER2 * &0020 -- MOS30 0441 D8D2 -- MOS30 0442 D8D2 -- MOS30 0443 D8D2 ; VIA pin assignments -- MOS30 0444 D8D2 ; -- MOS30 0445 D8D2 ; VIAA:- -- MOS30 0446 D8D2 ; PA7-PA0 keyboard -- MOS30 0447 D8D2 ; CA1 VSYNC interrupt -- MOS30 0448 D8D2 0002 VSYNC * CA1 -- MOS30 0449 D8D2 ; CA2 keyboard interrupt ('any key down') -- MOS30 0450 D8D2 0001 KEYBD * CA2 -- MOS30 0451 D8D2 ; PB7 VSP interrupt -- MOS30 0452 D8D2 ; PB6 VSP ready -- MOS30 0453 D8D2 ; PB5,PB4 paddle -- MOS30 0454 D8D2 ; PB3-PB0 addressable latch -- MOS30 0455 D8D2 ; PB3 data value -- MOS30 0456 D8D2 ; PB2-PB0 latch register -- MOS30 0457 D8D2 ; 0 sound enable -- MOS30 0458 D8D2 ; 1 speech RS -- MOS30 0459 D8D2 ; 2 speech WS -- MOS30 0460 D8D2 ; 3 keyboard disable -- MOS30 0461 D8D2 ; 4,5 hardware scroll -- MOS30 0462 D8D2 ; 6,7 ROM select -- MOS30 0463 D8D2 ; CB1 ADC -- MOS30 0464 D8D2 0010 ADC * CB1 -- MOS30 0465 D8D2 ; CB2 light pen -- MOS30 0466 D8D2 -- MOS30 0467 D8D2 ; VIAB:- -- MOS30 0468 D8D2 ; PA7-PA0 printer output -- MOS30 0469 D8D2 ; CA1 printer acknowledge -- MOS30 0470 D8D2 0002 PRNT * CA1 -- MOS30 0471 D8D2 ; CA2 printer strobe -- MOS30 0472 D8D2 ; PB7-PB0 reserved for user -- MOS30 0473 D8D2 ; CB1 reserved for user -- MOS30 0474 D8D2 ; CB2 reserved for user -- MOS30 0475 D8D2 ; TIMER 1 = MAIN CLOCK -- MOS30 0476 D8D2 0040 CLOCK * TIMER1 -- MOS30 0477 D8D2 -- MOS30 0478 D8D2 -- MOS30 0479 D8D2 ; page one is main system stack -- MOS30 0480 D8D2 ; -- MOS30 0481 D8D2 00FF STACK * &FF -- MOS30 0482 D8D2 -- MOS30 0483 D8D2 -- MOS30 0484 D8D2 -- MOS30 0485 D8D2 ; BUFFERS -- MOS30 0486 D8D2 -- MOS30 0487 D8D2 -- MOS30 0488 D8D2 ; keyboard -- MOS30 0489 D8D2 ; -- MOS30 0490 D8D2 03E0 RDCHBF * &03E0 ;RDCH (keyboard) buffer -- MOS30 0491 D8D2 0020 RDCHSZ * &0020 -- MOS30 0492 D8D2 -- MOS30 0493 D8D2 -- MOS30 0494 D8D2 ; sound -- MOS30 0495 D8D2 ; -- MOS30 0496 D8D2 0800 SNDWRK * &0800 ;sound workspace -- MOS30 0497 D8D2 0804 MACTIV * SNDWRK+&04 ;activation flags -- MOS30 0498 D8D2 -- MOS30 0499 D8D2 0840 SNDBF1 * &0840 ;sound buffer channel 1 -- MOS30 0500 D8D2 0010 SBSIZE * &0010 ;sound buffer size -- MOS30 0501 D8D2 0850 SNDBF2 * SNDBF1+SBSIZE ;sound buffer channel 2 -- MOS30 0502 D8D2 0860 SNDBF3 * SNDBF2+SBSIZE ;sound buffer channel 3 -- MOS30 0503 D8D2 0870 SNDBF4 * SNDBF3+SBSIZE ;sound buffer channel 4 -- MOS30 0504 D8D2 -- MOS30 0505 D8D2 -- MOS30 0506 D8D2 ; printer -- MOS30 0507 D8D2 ; -- MOS30 0508 D8D2 0880 PRNBF * &0880 ;print buffer -- MOS30 0509 D8D2 0040 PRNSZ * &0040 -- MOS30 0510 D8D2 -- MOS30 0511 D8D2 -- MOS30 0512 D8D2 ; envelopes -- MOS30 0513 D8D2 ; -- MOS30 0514 D8D2 08C0 ENVEL * &08C0 ;sound envelopes -- MOS30 0515 D8D2 0010 ENVSIZ * &0010 ;size of each envelope -- MOS30 0516 D8D2 0004 NENV * &0004 ;number of envelopes -- MOS30 0517 D8D2 -- MOS30 0518 D8D2 -- MOS30 0519 D8D2 ; RS423 output -- MOS30 0520 D8D2 ; -- MOS30 0521 D8D2 0900 RSROBF * &0900 ;RS423 output -- MOS30 0522 D8D2 00C0 RSROSZ * &00C0 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 48 MOS30 MOS30 Manifests MOS30 -- MOS30 0523 D8D2 -- MOS30 0524 D8D2 -- MOS30 0525 D8D2 ; speech -- MOS30 0526 D8D2 ; -- MOS30 0527 D8D2 09C0 SPCHBF * &09C0 ;speech buffer -- MOS30 0528 D8D2 0040 SPCHSZ * &0040 -- MOS30 0529 D8D2 -- MOS30 0530 D8D2 -- MOS30 0531 D8D2 ; RS423 input -- MOS30 0532 D8D2 ; -- MOS30 0533 D8D2 0A00 RSRIBF * &0A00 ;RS423 input -- MOS30 0534 D8D2 0100 RSRISZ * &0100 -- MOS30 0535 D8D2 0008 RSOVR * 8 ;handshake overflow allowance -- MOS30 0536 D8D2 -- MOS30 0537 D8D2 -- MOS30 0538 D8D2 ; soft key buffer -- MOS30 0539 D8D2 ; -- MOS30 0540 D8D2 0B00 SKPTR * &0B00 ;pointers to soft key strings -- MOS30 0541 D8D2 0010 NSOFTK * 16 -- MOS30 0542 D8D2 0B01 SKBUF * SKPTR+&01 ;N.B. soft key pointers are relative to this origin -- MOS30 0543 D8D2 0B10 SKEND * SKPTR+NSOFTK ;logical end of string -- MOS30 0544 D8D2 00EF TOTSFT * SKPTR+&0100-SKEND-&01 ;soft key data byte size -- MOS30 0545 D8D2 -- MOS30 0546 D8D2 -- MOS30 0547 D8D2 LNK MOS32 -- MOS32 0001 D8D2 -- MOS32 0002 D8D2 ; -> MOS32 -- MOS32 0003 D8D2 TTL MOS32 Initialisation and external interfaces -- MOS32 0004 D8D2 OPT MOS32 MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 49 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0005 D8D2 ;(c) 1981 ACORN Computers Limited -- MOS32 0006 D8D2 ;BBC Microcomputer Machine Operating System (MOS) -- MOS32 0007 D8D2 ;Change record: -- MOS32 0008 D8D2 ;Author(s): -- MOS32 0009 D8D2 ;PB Paul Bond -- MOS32 0010 D8D2 ;MP Mike Prees -- MOS32 0011 D8D2 -- MOS32 0012 D8D2 -- MOS32 0013 D8D2 ; origin of real code -- MOS32 0014 D8D2 ORG ORIGIN ;MOS starts where VDU ends -- MOS32 0015 D8D2 -- MOS32 0016 D8D2 -- MOS32 0017 D8D2 IPAGE0 ;page zero values -- MOS32 0018 D8D2 ; externally accessed zero page values -- MOS32 0019 D8D2 ^ &00FF -- MOS32 0020 D8D2 ; -- MOS32 0021 D8D2 00FF ESCFLG # 0 ;Bit 7 of this is the escape flag -- MOS32 0022 D8D2 -- MOS32 0023 D8D2 -- MOS32 0024 D8D2 ; bit7 escape pending -- MOS32 0025 D8D2 ;= ZERO -- MOS32 0026 D8D2 -- MOS32 0027 D8D2 00FF # -2 -- MOS32 0028 D8D2 00FD REPTR # &00 ;pointer after BRK -- MOS32 0029 D8D2 ;= NULL /;hi-byte -- MOS32 0030 D8D2 ;= NULL ;lo-byte -- MOS32 0031 D8D2 -- MOS32 0032 D8D2 00FD # -1 -- MOS32 0033 D8D2 00FC TEMPA # &00 ;user IRQ routine save slot for register A -- MOS32 0034 D8D2 ;= NULL -- MOS32 0035 D8D2 -- MOS32 0036 D8D2 00FC # -2 -- MOS32 0037 D8D2 00FA SEIWK # &00 ;two work slots used whilst interrupts disabled -- MOS32 0038 D8D2 ; -- MOS32 0039 D8D2 00FA JMILO * SEIWK +&00 ;used by OSBYTE/OSWORD -- MOS32 0040 D8D2 00FB JMIHI * SEIWK +&01 ;used by OSBYTE/OSWORD -- MOS32 0041 D8D2 ; -- MOS32 0042 D8D2 00FA KEYSV * SEIWK +&00 ;work area for ... -- MOS32 0043 D8D2 00FB SKSZWK * SEIWK +&01 ; ... soft key compaction (also SKSIZE) -- MOS32 0044 D8D2 ; -- MOS32 0045 D8D2 00FA KTEMP * SEIWK +&00 ;work area for keyboard -- MOS32 0046 D8D2 ; -- MOS32 0047 D8D2 00FA BUFFLO * SEIWK +&00 ;work slots used by buffer management -- MOS32 0048 D8D2 00FB BUFFHI * SEIWK +&01 -- MOS32 0049 D8D2 ; -- MOS32 0050 D8D2 00FA CRLO * SEIWK +&00 ;work slots used during ROM compare -- MOS32 0051 D8D2 00FB CRHI * SEIWK +&01 -- MOS32 0052 D8D2 ; -- MOS32 0053 D8D2 00FA MASK * SEIWK +&00 ;work slots used by set Rx/Tx RS423 baud rates -- MOS32 0054 D8D2 00FB BAUD * SEIWK +&01 -- MOS32 0055 D8D2 ; -- MOS32 0056 D8D2 00FA RSOP * SEIWK +&00 ;work slot used by RSUCTL -- MOS32 0057 D8D2 ; -- MOS32 0058 D8D2 00FA NOTEWK * SEIWK +&00 ;work slot used by NOTE -- MOS32 0059 D8D2 ; -- MOS32 0060 D8D2 00FA EVENTA * SEIWK +&00 ;work slot used by EVENT (hopefully no clashes) -- MOS32 0061 D8D2 ; -- MOS32 0062 D8D2 00FA PEEKLO * SEIWK +&00 ;work slot used by OSWORD read-byte/write-byte -- MOS32 0063 D8D2 00FB PEEKHI * SEIWK +&01 -- MOS32 0064 D8D2 ; -- MOS32 0065 D8D2 00FA SPWK1 * SEIWK +&00 ;used by speech sprocessing -- MOS32 0066 D8D2 00FB SPWK2 * SEIWK +&01 ;used by TIMER2 (speech) interrupt routine -- MOS32 0067 D8D2 -- MOS32 0068 D8D2 00FA # -1 -- MOS32 0069 D8D2 00F9 SPARE0 # &00 ;**************** -- MOS32 0070 D8D2 ; = NULL -- MOS32 0071 D8D2 -- MOS32 0072 D8D2 00F9 # -1 -- MOS32 0073 D8D2 00F8 SPARE1 # &00 ;**************** -- MOS32 0074 D8D2 ;= NULL -- MOS32 0075 D8D2 -- MOS32 0076 D8D2 00F8 # -2 -- MOS32 0077 D8D2 00F6 ROMPTR # &00 ;pointer used by ROM filing system -- MOS32 0078 D8D2 ;= NULL -- MOS32 0079 D8D2 ;= NULL -- MOS32 0080 D8D2 -- MOS32 0081 D8D2 00F6 # -1 -- MOS32 0082 D8D2 00F5 SEROM # &00 ;serial ROM id -- MOS32 0083 D8D2 ;= NULL -- MOS32 0084 D8D2 -- MOS32 0085 D8D2 00F5 # -1 -- MOS32 0086 D8D2 00F4 ROMID # &00 ;currently selected ROM -- MOS32 0087 D8D2 -- MOS32 0088 D8D2 ;= NULL -- MOS32 0089 D8D2 -- MOS32 0090 D8D2 00F4 # -2 -- MOS32 0091 D8D2 00F2 WORK # &00 ;miscellaneous pointer -- MOS32 0092 D8D2 ;= NULL -- MOS32 0093 D8D2 ;= NULL -- MOS32 0094 D8D2 -- MOS32 0095 D8D2 00F2 # -2 -- MOS32 0096 D8D2 ; WORD values may be shared with other sei-routines -- MOS32 0097 D8D2 00F0 WORDX # &00 -- MOS32 0098 D8D2 00F0 BYTEX * WORDX -- MOS32 0099 D8D2 00F1 WORDY * WORDX +&01 -- MOS32 0100 D8D2 00F1 BYTEY * WORDY -- MOS32 0101 D8D2 -- MOS32 0102 D8D2 00F0 # -1 -- MOS32 0103 D8D2 00EF WORDA # &00 -- MOS32 0104 D8D2 00EF BYTEA * WORDA -- MOS32 0105 D8D2 ;= NULL -- MOS32 0106 D8D2 -- MOS32 0107 D8D2 00EF # -1 -- MOS32 0108 D8D2 00EE PAGE1M # &00 ;selected page for 1MHz bus -- MOS32 0109 D8D2 ;= ZERO -- MOS32 0110 D8D2 -- MOS32 0111 D8D2 00EE # -1 -- MOS32 0112 D8D2 00ED OKEY # &00 ;current key value -- MOS32 0113 D8D2 ;= ZERO -- MOS32 0114 D8D2 -- MOS32 0115 D8D2 00ED # -1 -- MOS32 0116 D8D2 00EC CKEY # &00 ;current key value -- MOS32 0117 D8D2 ;= ZERO -- MOS32 0118 D8D2 -- MOS32 0119 D8D2 00EC # -1 -- MOS32 0120 D8D2 00EB ESSEMA # &00 ;EXEC/SPOOL semaphore (used by CFS) -- MOS32 0121 D8D2 -- MOS32 0122 D8D2 -- MOS32 0123 D8D2 00EB # -1 -- MOS32 0124 D8D2 00EA RSTUT # &00 ;RS423 printer timeouT -- MOS32 0125 D8D2 ;= ZERO MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 50 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0126 D8D2 -- MOS32 0127 D8D2 00EA # -2 -- MOS32 0128 D8D2 00E8 RDLNBF # &00 ;buffer address used by OSWORD readline routine -- MOS32 0129 D8D2 -- MOS32 0130 D8D2 00E8 # -1 -- MOS32 0131 D8D2 00E7 ARCTR # &00 ;auto-repeat counter -- MOS32 0132 D8D2 ;= ZERO -- MOS32 0133 D8D2 -- MOS32 0134 D8D2 00E7 # -1 -- MOS32 0135 D8D2 00E6 WRKCLI # &00 ;shared work slot with interrupts enabled -- MOS32 0136 D8D2 ; -- MOS32 0137 D8D2 00E6 RDCTEM * WRKCLI ;used by RDCH -- MOS32 0138 D8D2 00E6 CLIRY * WRKCLI ;used by CLI decoder -- MOS32 0139 D8D2 ; -- MOS32 0140 D8D2 00E6 NUMBER * WRKCLI ;work slot for GETNUM -- MOS32 0141 D8D2 00E6 CSKEY * NUMBER ;current softkey number (must not share with KMASK or KQUOTE) -- MOS32 0142 D8D2 ; -- MOS32 0143 D8D2 00E6 FILEY * WRKCLI ;save area for register Y -- MOS32 0144 D8D2 00E6 EXECY * FILEY ;save area used by EXEC -- MOS32 0145 D8D2 -- MOS32 0146 D8D2 00E6 SPOOLY * FILEY ;save area used by SPOOL -- MOS32 0147 D8D2 ;= NULL -- MOS32 0148 D8D2 -- MOS32 0149 D8D2 00E6 # -1 -- MOS32 0150 D8D2 00E5 FXREGX # &00 ;used by FX CLI command -- MOS32 0151 D8D2 00E5 KMASK # &00 ;used by GSREAD -- MOS32 0152 D8D2 ; must not be shared with CSKEY -- MOS32 0153 D8D2 ;= NULL -- MOS32 0154 D8D2 -- MOS32 0155 D8D2 00E5 # -1 -- MOS32 0156 D8D2 00E4 FXREGY # &00 ;used by FX CLI command -- MOS32 0157 D8D2 00E4 KQUOTE # &00 ;must not be shared with KMASK -- MOS32 0158 D8D2 ; must not be shared with CSKEY -- MOS32 0159 D8D2 ;= NULL -- MOS32 0160 D8D2 -- MOS32 0161 D8D2 00E4 # -1 -- MOS32 0162 D8D2 00E3 CFS1 # &00 ;reserved for CFS -- MOS32 0163 D8D2 -- MOS32 0164 D8D2 00E3 # -1 -- MOS32 0165 D8D2 ; -- MOS32 0166 D8D2 ; CFS workspace -- MOS32 0167 D8D2 ; ============= -- MOS32 0168 D8D2 ; -- MOS32 0169 D8D2 00E2 CFS0 # &00 ;reserved for CFS -- MOS32 0170 D8D2 00E2 CFSTAT * CFS0 -- MOS32 0171 D8D2 ;PAGE ZERO -- MOS32 0172 D8D2 -- MOS32 0173 D8D2 00B0 PZERO * &00B0 ;Start of p.0 workspace -- MOS32 0174 D8D2 -- MOS32 0175 D8D2 00B0 BKADDR * PZERO ;4 BYTE BLOCK PTR. -- MOS32 0176 D8D2 00B4 HIADDR * BKADDR +&04 ;Top of data being saved, -- MOS32 0177 D8D2 ;Must be contiguous with BKADDR -- MOS32 0178 D8D2 -- MOS32 0179 D8D2 00B4 BLOKNO * HIADDR -- MOS32 0180 D8D2 00B6 SRCHBK * BLOKNO +&02 ;Block numbers being searched for -- MOS32 0181 D8D2 ;Not used in SAVE, hence can overlap HIADDR -- MOS32 0182 D8D2 -- MOS32 0183 D8D2 00B8 FTPTR * HIADDR +&04 ;Used in VSTRIN -- MOS32 0184 D8D2 00BA ERRSW * FTPTR +&02 ;In p.0 to save space -- MOS32 0185 D8D2 00BB USFLGS * ERRSW +&01 -- MOS32 0186 D8D2 00BC TEMP * USFLGS +&01 -- MOS32 0187 D8D2 00BD IBUF * TEMP +&01 -- MOS32 0188 D8D2 00BE CHKSUM * IBUF +&01 -- MOS32 0189 D8D2 00C0 IFLAG * CHKSUM +&02 -- MOS32 0190 D8D2 00C1 HDRCRC * IFLAG +&01 -- MOS32 0191 D8D2 00C2 ITYPE * HDRCRC +&01 -- MOS32 0192 D8D2 00C3 CURDRV * ITYPE +&01 ;Currently selected cassette -- MOS32 0193 D8D2 00C4 IADDR * CURDRV +&01 -- MOS32 0194 D8D2 00C6 SPEED * IADDR +&02 -- MOS32 0195 D8D2 00C7 GAPTIM * SPEED +&01 -- MOS32 0196 D8D2 00C8 GENPTR * GAPTIM +&01 ;Used in FILEGO/LOAD only -- MOS32 0197 D8D2 00CA TXFLAG * GENPTR +&02 ;"We are transmitting" flag -- MOS32 0198 D8D2 00CB CRCCNT * TXFLAG +&01 ;Used in CRC check -- MOS32 0199 D8D2 00CC FSIZE * CRCCNT + 1 ;File size to modify control block in LOAD -- MOS32 0200 D8D2 -- MOS32 0201 D8D2 00E3 OPTS * CFS1 ;Retained over filing system change -- MOS32 0202 D8D2 ;************************************** -- MOS32 0203 D8D2 -- MOS32 0204 D8D2 00E2 BPAGE0 # &00 -- MOS32 0205 D8D2 -- MOS32 0206 D8D2 -- MOS32 0207 D8D2 -- MOS32 0208 D8D2 IPAGE2 -- MOS32 0209 D8D2 ; page two values -- MOS32 0210 D8D2 ^ &0200 -- MOS32 0211 D8D2 0200 APAGE2 # &00 -- MOS32 0212 D8D2 0200 USRVEC # &02 ;user vector -- MOS32 0213 D8D2 55 = BADFX -- MOS32 0214 D8D3 E3 = /(BADFX ) -- MOS32 0215 D8D4 0202 BRKVEC # &02 ;BRK handling -- MOS32 0216 D8D4 6A = DEFBRK -- MOS32 0217 D8D5 DB = /(DEFBRK ) -- MOS32 0218 D8D6 0204 IRQALL # &02 ;all IRQs indirect thru here -- MOS32 0219 D8D6 23 = DEFIRQ -- MOS32 0220 D8D7 DE = /(DEFIRQ ) -- MOS32 0221 D8D8 0206 IRQVEC # &02 ;unrecognised IRQ -- MOS32 0222 D8D8 35 = IRQTWO -- MOS32 0223 D8D9 DE = /(IRQTWO ) -- MOS32 0224 D8DA 0208 COMVEC # &02 ;command line intepreter -- MOS32 0225 D8DA C4 = CLINT -- MOS32 0226 D8DB DF = /(CLINT ) -- MOS32 0227 D8DC 020A BYTVEC # &02 ;MOS routine, 0 1 or 2 arguments -- MOS32 0228 D8DC B3 = BYTE -- MOS32 0229 D8DD E7 = /(BYTE ) -- MOS32 0230 D8DE 020C WORVEC # &02 ;MOS routine, >2 arguments -- MOS32 0231 D8DE 1D = WORD -- MOS32 0232 D8DF E8 = /(WORD ) -- MOS32 0233 D8E0 020E WRCVEC # &02 ;write character -- MOS32 0234 D8E0 F6 = WRCH -- MOS32 0235 D8E1 E0 = /(WRCH ) -- MOS32 0236 D8E2 0210 RDCVEC # &02 ;read character -- MOS32 0237 D8E2 71 = RDCH -- MOS32 0238 D8E3 DE = /(RDCH ) -- MOS32 0239 D8E4 CFSTAB -- MOS32 0240 D8E4 0212 FILVEC # &02 ;load/save memory image -- MOS32 0241 D8E4 E2 = FILEGO -- MOS32 0242 D8E5 F1 = /(FILEGO ) -- MOS32 0243 D8E6 0214 ARGVEC # &02 ;read/set file attributes -- MOS32 0244 D8E6 98 = ARGGO -- MOS32 0245 D8E7 F1 = /(ARGGO ) -- MOS32 0246 D8E8 0216 BGTVEC # &02 ;get byte from random file MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 51 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0247 D8E8 CF = GETBYT -- MOS32 0248 D8E9 F4 = /(GETBYT ) -- MOS32 0249 D8EA 0218 BPTVEC # &02 ;put byte to random file -- MOS32 0250 D8EA 32 = PUTBYT -- MOS32 0251 D8EB F5 = /(PUTBYT ) -- MOS32 0252 D8EC 021A GPBVEC # &02 ;get/put bytes -- MOS32 0253 D8EC B2 = RTS -- MOS32 0254 D8ED FF = /(RTS ) -- MOS32 0255 D8EE 021C FNDVEC # &02 ;open/close random file -- MOS32 0256 D8EE D0 = FIND -- MOS32 0257 D8EF F3 = /(FIND ) -- MOS32 0258 D8F0 021E FSCVEC # &02 ;file system control entry -- MOS32 0259 D8F0 AD = FSFUNC -- MOS32 0260 D8F1 F1 = /(FSFUNC ) -- MOS32 0261 D8F2 0220 EVTVEC # &02 ;event interrupt -- MOS32 0262 D8F2 B2 = DEFEVT -- MOS32 0263 D8F3 FF = /(DEFEVT ) -- MOS32 0264 D8F4 0222 UPTVEC # &02 ;user print routine -- MOS32 0265 D8F4 ; default hangs printer -- MOS32 0266 D8F4 B2 = DEFUPT -- MOS32 0267 D8F5 FF = /(DEFUPT ) -- MOS32 0268 D8F6 0224 NETVEC # &02 ;ECONET effects -- MOS32 0269 D8F6 ; default hangs printer -- MOS32 0270 D8F6 B2 = DEFNET -- MOS32 0271 D8F7 FF = /(DEFNET ) -- MOS32 0272 D8F8 0226 VDUVEC # &02 ;VDU command indirection -- MOS32 0273 D8F8 -- MOS32 0274 D8F8 B2 = RTS -- MOS32 0275 D8F9 FF = /(RTS ) -- MOS32 0276 D8FA 0228 KEYVEC # &02 ;keyboard control indirection -- MOS32 0277 D8FA 1B = DEFKEY -- MOS32 0278 D8FB EF = /(DEFKEY ) -- MOS32 0279 D8FC 022A INSVEC # &02 ;buffer insert indirection -- MOS32 0280 D8FC F7 = INS -- MOS32 0281 D8FD E4 = /(INS ) -- MOS32 0282 D8FE 022C REMVEC # &02 ;buffer remove indirection -- MOS32 0283 D8FE A8 = REM -- MOS32 0284 D8FF E4 = /(REM ) -- MOS32 0285 D900 022E CNPVEC # &02 ;buffer count / purge buffer indirection -- MOS32 0286 D900 22 = CNP -- MOS32 0287 D901 E2 = /(CNP ) -- MOS32 0288 D902 0230 INDONE # &02 -- MOS32 0289 D902 B2 = RTS -- MOS32 0290 D903 FF = /(RTS ) -- MOS32 0291 D904 0232 INDTWO # &02 -- MOS32 0292 D904 B2 = RTS -- MOS32 0293 D905 FF = /(RTS ) -- MOS32 0294 D906 0234 INDTRH # &02 -- MOS32 0295 D906 B2 = RTS -- MOS32 0296 D907 FF = /(RTS ) -- MOS32 0297 D908 0036 VLEN * @-APAGE2 -- MOS32 0298 D908 ; -- MOS32 0299 D908 001B NP2IND * VLEN:SHR: 1 ;number of page 2 indirections -- MOS32 0300 D908 0051 ROMIVS * NP2IND* 3 ;page ROM indirection vector size -- MOS32 0301 D908 0D9F ROMVEC * &0DF0-ROMIVS ;paged ROM routine vectors -- MOS32 0302 D908 -- MOS32 0303 D908 -- MOS32 0304 D908 0236 VARS # &00 -- MOS32 0305 D908 ; -- MOS32 0306 D908 0236 # &02 ;variables origin -- MOS32 0307 D908 90 = VBASE ;166 -- MOS32 0308 D909 01 = /(VBASE ) -- MOS32 0309 D90A -- MOS32 0310 D90A 0238 # &02 ;origin of 3-byte ROM indirection vectors -- MOS32 0311 D90A 9F = ROMVEC ;168 -- MOS32 0312 D90B 0D = /(ROMVEC ) -- MOS32 0313 D90C -- MOS32 0314 D90C 023A # &02 ;paged ROM info -- MOS32 0315 D90C A1 = ROMS ;170 -- MOS32 0316 D90D 02 = /(ROMS ) -- MOS32 0317 D90E -- MOS32 0318 D90E 023C # &02 ;keyboard matrix info -- MOS32 0319 D90E 3A = KTBL ;172 -- MOS32 0320 D90F F0 = /(KTBL ) -- MOS32 0321 D910 -- MOS32 0322 D910 023E # &02 ;VDU module origin of variables -- MOS32 0323 D910 00 = VARBLE ;174 -- MOS32 0324 D911 03 = /(VARBLE ) -- MOS32 0325 D912 -- MOS32 0326 D912 0240 CYCLE # &01 ;filing system timeout byte -- MOS32 0327 D912 -- MOS32 0328 D912 00 = NULL -- MOS32 0329 D913 -- MOS32 0330 D913 0241 RDCHSW # &01 ;RDCH source switch (assumed not in page zero, see KTBL) -- MOS32 0331 D913 00 = ZERO ;177 BRDCH (zero) -- MOS32 0332 D914 -- MOS32 0333 D914 0242 KSEMA # &01 ;keyboard semaphore -- MOS32 0334 D914 FF = &FF ;178 -- MOS32 0335 D915 -- MOS32 0336 D915 0243 IHWM # &01 -- MOS32 0337 D915 -- MOS32 0338 D915 00 = ZERO ;179 -- MOS32 0339 D916 -- MOS32 0340 D916 0244 HWM # &01 -- MOS32 0341 D916 -- MOS32 0342 D916 00 = NULL ;180 -- MOS32 0343 D917 -- MOS32 0344 D917 0245 RS8BIT # &01 -- MOS32 0345 D917 01 = &01 ;181 1 => 8 bits, 0 => soft key processing -- MOS32 0346 D918 -- MOS32 0347 D918 -- MOS32 0348 D918 0246 FONTSW # &01 ;current state of font explosion/implosion -- MOS32 0349 D918 -- MOS32 0350 D918 00 = ZERO ;182 -- MOS32 0351 D919 ; -- MOS32 0352 D919 0247 SROMSW # &01 ;SEROM/cassette switch -- MOS32 0353 D919 -- MOS32 0354 D919 00 = ZERO ;183 cassette by default -- MOS32 0355 D91A -- MOS32 0356 D91A -- MOS32 0357 D91A 0248 VPREGA # &01 ;video ULA control register 0 -- MOS32 0358 D91A 00 = NULL ;184 -- MOS32 0359 D91B ; -- MOS32 0360 D91B 0249 VPREGB # &01 ;video ULA control register 1 -- MOS32 0361 D91B 00 = NULL ;185 -- MOS32 0362 D91C -- MOS32 0363 D91C -- MOS32 0364 D91C 024A REPROM # &01 ;ROM id after BRK -- MOS32 0365 D91C 00 = NULL ;186 -- MOS32 0366 D91D ; -- MOS32 0367 D91D 024B BROMID # &01 ;BASIC ROM id MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 52 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0368 D91D FF = &FF ;187 -- MOS32 0369 D91E -- MOS32 0370 D91E -- MOS32 0371 D91E 024C ADCHAN # &01 ;ADC channel number -- MOS32 0372 D91E 04 = NADC ;188 -- MOS32 0373 D91F ; -- MOS32 0374 D91F 024D MAXADC # &01 ;maximum ADC channel in use -- MOS32 0375 D91F 04 = NADC ;189 -- MOS32 0376 D920 ; -- MOS32 0377 D920 024E ADCCNV # &01 -- MOS32 0378 D920 00 = ZERO ;190 ADC conversion type (12 bits) -- MOS32 0379 D921 -- MOS32 0380 D921 -- MOS32 0381 D921 024F RSFLAG # &01 ;RS423 use flag -- MOS32 0382 D921 -- MOS32 0383 D921 ; 1xxx xxxx => dormant -- MOS32 0384 D921 ; 0xxx xxxx => busy -- MOS32 0385 D921 FF = &FF ;191 -- MOS32 0386 D922 ; -- MOS32 0387 D922 0250 RSCTFL # &01 -- MOS32 0388 D922 -- MOS32 0389 D922 56 = RSCDEF ;192 -- MOS32 0390 D923 -- MOS32 0391 D923 -- MOS32 0392 D923 ; -- MOS32 0393 D923 0251 FLCNT # &01 ;flash period counter -- MOS32 0394 D923 19 = &19 ;193 1/2 SECOND -- MOS32 0395 D924 ; -- MOS32 0396 D924 0252 FLASHB # &00 ;used by flash FX calls -- MOS32 0397 D924 0252 FLSPC # &01 ;flash space period -- MOS32 0398 D924 19 = &19 ;194 1/2 SECOND -- MOS32 0399 D925 0253 FLMRK # &01 ;flash mark period -- MOS32 0400 D925 19 = &19 ;195 1/2 SECOND -- MOS32 0401 D926 ; -- MOS32 0402 D926 -- MOS32 0403 D926 -- MOS32 0404 D926 ;**** FOLLOWING MUST BE CONTIGUOUS (c.f. *FX11 and *FX12) **** -- MOS32 0405 D926 0254 FARSET # &01 ;first auto-repeat reset -- MOS32 0406 D926 32 = DAUTOD ;196 -- MOS32 0407 D927 0255 ARSET # &01 ;reset for above -- MOS32 0408 D927 08 = DAUTOP ;197 -- MOS32 0409 D928 -- MOS32 0410 D928 -- MOS32 0411 D928 0256 EXECH # &01 ;*EXEC handle -- MOS32 0412 D928 -- MOS32 0413 D928 00 = ZERO ;198 -- MOS32 0414 D929 ; -- MOS32 0415 D929 0257 SPOOLH # &01 ;*SPOOL handle -- MOS32 0416 D929 -- MOS32 0417 D929 00 = ZERO ;199 -- MOS32 0418 D92A ; -- MOS32 0419 D92A 0258 CRIT # &01 ;critical region indicator -- MOS32 0420 D92A -- MOS32 0421 D92A 00 = &00 ;200 not within critical region -- MOS32 0422 D92B ; -- MOS32 0423 D92B 0259 NETKDS # &01 ;net keyboard disable -- MOS32 0424 D92B 00 = ZERO ;201 default: not disabled -- MOS32 0425 D92C ; -- MOS32 0426 D92C 025A KSTAT # &01 ;keyboard status (see MOS56) -- MOS32 0427 D92C 20 = SHFTL ;202 -- MOS32 0428 D92D ; -- MOS32 0429 D92D 025B RSHLVL # &01 ;RS423 handshake level -- MOS32 0430 D92D 09 = RSOVR+&01 ;203 -- MOS32 0431 D92E ; -- MOS32 0432 D92E 025C RSSHUT # &01 ;suppress RS423 input -- MOS32 0433 D92E 00 = ZERO ;204 default: enable RS423 input -- MOS32 0434 D92F ; -- MOS32 0435 D92F 025D RSCASS # &01 ;cassette/RS423 serial processor select -- MOS32 0436 D92F 00 = ZERO ;205 $00 => select RS423, $40 => select cassette -- MOS32 0437 D930 ; -- MOS32 0438 D930 025E NETIOC # &01 ;net interception of OS calls -- MOS32 0439 D930 00 = ZERO ;206 default: not intercepted -- MOS32 0440 D931 ; -- MOS32 0441 D931 025F NETRDC # &01 ;net interception of RDCH -- MOS32 0442 D931 00 = ZERO ;207 default: not intercepted -- MOS32 0443 D932 ; -- MOS32 0444 D932 0260 NETWRC # &01 ;net interception of WRCH -- MOS32 0445 D932 00 = ZERO ;208 default: not intercepted -- MOS32 0446 D933 ; -- MOS32 0447 D933 0261 SHUTSP # &01 ;speech suppressor -- MOS32 0448 D933 50 = SPOPSP ;209 -- MOS32 0449 D934 ; -- MOS32 0450 D934 0262 SHUTUP # &01 ;sound suppressor -- MOS32 0451 D934 00 = ZERO ;210 allow sound by default -- MOS32 0452 D935 ; -- MOS32 0453 D935 0263 BELLC # &01 ;bell channel -- MOS32 0454 D935 03 = &03 ;211 -- MOS32 0455 D936 ; -- MOS32 0456 D936 0264 BELLI # &01 ;bell envelope and chord information -- MOS32 0457 D936 90 = &90 ;212 -- MOS32 0458 D937 ; -- MOS32 0459 D937 0265 BELLN # &01 ;bell frequency -- MOS32 0460 D937 64 = &64 ;213 -- MOS32 0461 D938 ; -- MOS32 0462 D938 0266 BELLD # &01 ;bell duration -- MOS32 0463 D938 06 = &06 ;214 -- MOS32 0464 D939 ; -- MOS32 0465 D939 0267 QUIET # &01 -- MOS32 0466 D939 81 = &81 ;215 suppress start-up message / !BOOT option -- MOS32 0467 D93A ; -- MOS32 0468 D93A 0268 SOFKL # &01 ;soft key string length -- MOS32 0469 D93A 00 = ZERO ;216 -- MOS32 0470 D93B ; -- MOS32 0471 D93B 0269 LINES # &01 ;used by VDU software -- MOS32 0472 D93B -- MOS32 0473 D93B 00 = ZERO ;217 used by VDU software in page mode -- MOS32 0474 D93C ; -- MOS32 0475 D93C 026A QPOSN # &01 ;VDU queue count -- MOS32 0476 D93C -- MOS32 0477 D93C 00 = ZERO ;218 -- MOS32 0478 D93D ; -- MOS32 0479 D93D 026B TABCOD # &01 ;TAB key code -- MOS32 0480 D93D 09 = TAB ;219 -- MOS32 0481 D93E ; -- MOS32 0482 D93E 026C INTCH # &01 -- MOS32 0483 D93E 1B = ESC ;220 interrupt character (normally ESC) -- MOS32 0484 D93F ; -- MOS32 0485 D93F 026D SOFTLO # &00 -- MOS32 0486 D93F ;221 softkey 10 feature -- MOS32 0487 D93F 026D EXBREK # &01 -- MOS32 0488 D93F 01 = &01 ;expand softkey MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 53 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0489 D940 ;222 reserved -- MOS32 0490 D940 026E # &01 -- MOS32 0491 D940 D0 = &D0 -- MOS32 0492 D941 ;223 reserved -- MOS32 0493 D941 026F # &01 -- MOS32 0494 D941 E0 = &E0 -- MOS32 0495 D942 ;224 reserved -- MOS32 0496 D942 0270 # &01 -- MOS32 0497 D942 F0 = &F0 -- MOS32 0498 D943 ;225 -- MOS32 0499 D943 ; 0 => enable softkey expansion on fnkey -- MOS32 0500 D943 ; N => return code N+i for fnkey(i), i=0..9 -- MOS32 0501 D943 0271 # &01 -- MOS32 0502 D943 01 = &01 ;return soft strings by default -- MOS32 0503 D944 ;226 -- MOS32 0504 D944 ; 0 => enable softkey expansion on SHIFT/fnkey -- MOS32 0505 D944 ; N => return code N+i for SHIFT/fnkey(i), i=0..9 -- MOS32 0506 D944 0272 # &01 -- MOS32 0507 D944 80 = &80 ;return codes $80..$89 by default (user definable characters) -- MOS32 0508 D945 ;227 -- MOS32 0509 D945 ; 0 => enable softkey expansion on CTRL/fnkey -- MOS32 0510 D945 ; N => return code N+i for CTRL/fnkey(i), i=0..9 -- MOS32 0511 D945 0273 # &01 -- MOS32 0512 D945 90 = &90 ;return codes $90..$99 by default (user definable characters) -- MOS32 0513 D946 ;228 -- MOS32 0514 D946 ; 0 => enable softkey expansion on SHIFT/CTRL/fnkey -- MOS32 0515 D946 ; N => return code N+i for SHIFT/CTRL/fnkey(i), i=0..9 -- MOS32 0516 D946 0274 # &01 -- MOS32 0517 D946 00 = ZERO ;ingnore key combination by default -- MOS32 0518 D947 -- MOS32 0519 D947 0275 ESCHAR # &01 ;make INTERRUPT CHARACTER return normal value -- MOS32 0520 D947 00 = ZERO ;229 <>0 => return normal value -- MOS32 0521 D948 -- MOS32 0522 D948 0276 EAOPT # &01 ;suppress normal escape acknowledge actions -- MOS32 0523 D948 00 = ZERO ;230 suppress if <> 0 -- MOS32 0524 D949 -- MOS32 0525 D949 0277 B6522 # &01 ;$00 => no, $FF => second 6522 present -- MOS32 0526 D949 FFBYT -- MOS32 0527 D949 FF = &FF ;231 assume 6522B present -- MOS32 0528 D94A -- MOS32 0529 D94A 0278 C6850 # &01 ;$00 => no, $FF => 6850 present -- MOS32 0530 D94A FF = &FF ;232 assume 6850 present -- MOS32 0531 D94B -- MOS32 0532 D94B 0279 A6522 # &01 ;$00 => no, $FF => primary 6522 present -- MOS32 0533 D94B FF = &FF ;233 assume 6522A present -- MOS32 0534 D94C -- MOS32 0535 D94C 027A TUBEM # &01 ;$FF if tube present -- MOS32 0536 D94C 027A TUBE * TUBEM -- MOS32 0537 D94C 00 = ZERO ;234 assume tube not present -- MOS32 0538 D94D -- MOS32 0539 D94D 027B SPFLAG # &01 ;$FF if speech chip present -- MOS32 0540 D94D 00 = ZERO ;235 -- MOS32 0541 D94E -- MOS32 0542 D94E 027C WRCHSW # &01 ;OSWRCH destinations flag -- MOS32 0543 D94E 0001 WRRS * &01 ;WRCH is RS423 -- MOS32 0544 D94E 0002 WRVDU * &02 ;WRCH is ***NOT*** VDU -- MOS32 0545 D94E 0004 WRPREN * &04 ;0 => ENABLE PRINT -- MOS32 0546 D94E 0008 WRPRNT * &08 ;WRCH is ***NOT*** print -- MOS32 0547 D94E 0010 WRSPL * &10 ;WRCH is ***NOT*** spool -- MOS32 0548 D94E 0040 WRVDU1 * &40 ;WRCH to printer only by VDU1 -- MOS32 0549 D94E 00 = ZERO ;236 WRCH is VDU/print/spool -- MOS32 0550 D94F ; ******** DO NOT ALTER ******** -- MOS32 0551 D94F -- MOS32 0552 D94F 027D CURSED # &01 -- MOS32 0553 D94F 00 = ZERO ;237 -- MOS32 0554 D950 -- MOS32 0555 D950 007E MPAGE2 * @-APAGE2 -- MOS32 0556 D950 -- MOS32 0557 D950 027E SPARE8 # &03 -- MOS32 0558 D950 00 = ZERO -- MOS32 0559 D951 00 = ZERO -- MOS32 0560 D952 00 = ZERO -- MOS32 0561 D953 ; 238, 239, 240 -- MOS32 0562 D953 -- MOS32 0563 D953 0281 UFX1 # &01 ;FX 1 value -- MOS32 0564 D953 00 = ZERO ;241 -- MOS32 0565 D954 ; ******** DO NOT ALTER ******** -- MOS32 0566 D954 -- MOS32 0567 D954 0282 SPREGA # &01 ;serial processor register contents -- MOS32 0568 D954 -- MOS32 0569 D954 64 = B9600 ;242 -- MOS32 0570 D955 -- MOS32 0571 D955 0283 TIMESW # &01 ;TIME pointer, either 5 or 10 -- MOS32 0572 D955 05 = &05 ;243 -- MOS32 0573 D956 -- MOS32 0574 D956 0284 USKFLG # &01 ;soft key consistency flag -- MOS32 0575 D956 FF = &FF ;244 =0 => soft keys consistent -- MOS32 0576 D957 -- MOS32 0577 D957 0285 PRNTSW # &01 ;PRINT destination flag -- MOS32 0578 D957 0001 PCEN * &01 ;print is (C)ENTRONICS -- MOS32 0579 D957 0002 PRS * &02 ;print is (RS)232 -- MOS32 0580 D957 0003 PUSE * &03 ;print is (user) routine -- MOS32 0581 D957 0004 PNET * &04 ;print is ECO(NET) -- MOS32 0582 D957 01 = PCEN ;245 -- MOS32 0583 D958 ; ******** DO NOT ALTER ******** -- MOS32 0584 D958 -- MOS32 0585 D958 0286 PIGNOR # &01 ;printer ignore character -- MOS32 0586 D958 0A = MLF ;246 support auto-linefeed printers by default -- MOS32 0587 D959 ; ******** DO NOT ALTER ******** -- MOS32 0588 D959 -- MOS32 0589 D959 0087 PPAGE2 * @-APAGE2 -- MOS32 0590 D959 -- MOS32 0591 D959 0287 BREAKI # &03 ;used for interception of BREAK -- MOS32 0592 D959 00 = ZERO ;247 change to $4C to intercept BREAK -- MOS32 0593 D95A 00 = ZERO ;248 -- MOS32 0594 D95B 00 = ZERO ;249 -- MOS32 0595 D95C -- MOS32 0596 D95C 028A SPARE9 # &02 ;spare -- MOS32 0597 D95C 00 = ZERO ;250 -- MOS32 0598 D95D 00 = ZERO ;251 -- MOS32 0599 D95E -- MOS32 0600 D95E 028C LROMID # &01 ;current language ROM id -- MOS32 0601 D95E FF = &FF ;252 -- MOS32 0602 D95F -- MOS32 0603 D95F 008D NPAGE2 * @-APAGE2 -- MOS32 0604 D95F -- MOS32 0605 D95F 028D TYPE # &01 ;restart type -- MOS32 0606 D95F ;= ZERO ;253 -- MOS32 0607 D95F -- MOS32 0608 D95F 028E MODELB # &01 -- MOS32 0609 D95F 028E MODEL * MODELB MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 54 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0610 D95F ;= ZERO ;254 -- MOS32 0611 D95F -- MOS32 0612 D95F 028F OPTION # &01 ;start up options -- MOS32 0613 D95F ;= ZERO ;255 -- MOS32 0614 D95F -- MOS32 0615 D95F 0190 VBASE * @-&100 -- MOS32 0616 D95F 00A6 VORG * VARS-VBASE -- MOS32 0617 D95F [ VARS-VBASE- 166=0 -- MOS32 0618 D95F | -- MOS32 0620 D95F ] -- MOS32 0621 D95F ; -- MOS32 0622 D95F -- MOS32 0623 D95F 0290 DPAGE2 # &00 -- MOS32 0624 D95F -- MOS32 0625 D95F 0290 VERTIC # &01 ;VDU vertical adjust -- MOS32 0626 D95F -- MOS32 0627 D95F ;= ZERO -- MOS32 0628 D95F -- MOS32 0629 D95F 0291 INTERL # &01 ;interlace invert -- MOS32 0630 D95F -- MOS32 0631 D95F ;= ZERO -- MOS32 0632 D95F -- MOS32 0633 D95F ; time -- MOS32 0634 D95F 0292 TIME1 # &05 ;first absolute time counter -- MOS32 0635 D95F 0292 TIME * TIME1 -- MOS32 0636 D95F ;= ZERO -- MOS32 0637 D95F ;= ZERO -- MOS32 0638 D95F ;= ZERO -- MOS32 0639 D95F ;= ZERO -- MOS32 0640 D95F ;= ZERO -- MOS32 0641 D95F 0297 TIME2 # &05 ;second absolute time counter -- MOS32 0642 D95F ;= ZERO -- MOS32 0643 D95F ;= ZERO -- MOS32 0644 D95F ;= ZERO -- MOS32 0645 D95F ;= ZERO -- MOS32 0646 D95F ;= ZERO -- MOS32 0647 D95F ; N.B. soft restart zeroes from here onwards -- MOS32 0648 D95F 029C STPW # &05 ;stopwatch counter -- MOS32 0649 D95F 029C CPAGE2 * STPW -- MOS32 0650 D95F ;= ZERO -- MOS32 0651 D95F ;= ZERO -- MOS32 0652 D95F ;= ZERO -- MOS32 0653 D95F ;= ZERO -- MOS32 0654 D95F ;= ZERO -- MOS32 0655 D95F -- MOS32 0656 D95F 02A1 ROMS # NROM -- MOS32 0657 D95F -- MOS32 0658 D95F ;= ZERO (NROM times) -- MOS32 0659 D95F -- MOS32 0660 D95F ; work slots used by CLI -- MOS32 0661 D95F 02B1 RDCTLO # &01 ;INKEY wait counter 1 -- MOS32 0662 D95F ;= ZERO -- MOS32 0663 D95F 02B2 RDCTHI # &01 ;INKEY wait counter 2 -- MOS32 0664 D95F ;= ZERO -- MOS32 0665 D95F -- MOS32 0666 D95F ; work slots used by RDLN -- MOS32 0667 D95F ; values must not be altered by any sei-routine -- MOS32 0668 D95F 02B3 RDLNN # &01 -- MOS32 0669 D95F ;= NULL -- MOS32 0670 D95F 02B4 RDLNLC # &01 -- MOS32 0671 D95F ;= NULL -- MOS32 0672 D95F 02B5 RDLNHC # &01 -- MOS32 0673 D95F ;= NULL -- MOS32 0674 D95F -- MOS32 0675 D95F ; ADC control -- MOS32 0676 D95F ; may not be shared -- MOS32 0677 D95F 02B6 ADCLOV # NADC ;ADC lo byte values (0 to 3) -- MOS32 0678 D95F ;= ZERO -- MOS32 0679 D95F ;= ZERO -- MOS32 0680 D95F ;= ZERO -- MOS32 0681 D95F ;= ZERO -- MOS32 0682 D95F 02BA ADCHIV # NADC ;ADC hi byte values (0 to 3) -- MOS32 0683 D95F ;= ZERO -- MOS32 0684 D95F ;= ZERO -- MOS32 0685 D95F ;= ZERO -- MOS32 0686 D95F ;= ZERO -- MOS32 0687 D95F 02BE ADCFLG # &01 -- MOS32 0688 D95F ;= ZERO -- MOS32 0689 D95F -- MOS32 0690 D95F ; event interrupt vectors -- MOS32 0691 D95F 000A NEVENT * &000A ;total number of events -- MOS32 0692 D95F 02BF EVENTS # NEVENT ;event flags -- MOS32 0693 D95F 0000 EVMPTY * &00 ;output buffer empty -- MOS32 0694 D95F ;= ZERO -- MOS32 0695 D95F 0001 EVFULL * &01 ;input buffer full -- MOS32 0696 D95F ;= ZERO -- MOS32 0697 D95F 0002 EVKYBD * &02 ;keyboard interrupt -- MOS32 0698 D95F ;= ZERO -- MOS32 0699 D95F 0003 EVADC * &03 ;ADC conversion complete -- MOS32 0700 D95F ;= ZERO -- MOS32 0701 D95F 0004 EVVSYN * &04 ;VSYNC -- MOS32 0702 D95F ;= ZERO -- MOS32 0703 D95F 0005 EVSWCH * &05 ;(timer) stopwatch -- MOS32 0704 D95F ;= ZERO -- MOS32 0705 D95F 0006 EVESC * &06 ;escape detected -- MOS32 0706 D95F ;= ZERO -- MOS32 0707 D95F 0007 EVRS * &07 ;RS423 Rx error -- MOS32 0708 D95F ;= ZERO -- MOS32 0709 D95F 0008 EVUSER * &08 ;user allocated event -- MOS32 0710 D95F ;= ZERO -- MOS32 0711 D95F -- MOS32 0712 D95F ; miscellaneous -- MOS32 0713 D95F 02C9 SOFKP # &01 ;pointer to soft key string -- MOS32 0714 D95F ;= NULL -- MOS32 0715 D95F ; -- MOS32 0716 D95F 02CA FARCTR # &01 ;first auto-repeat count -- MOS32 0717 D95F ;= NULL -- MOS32 0718 D95F -- MOS32 0719 D95F 02CB KSCSTA # &03 ;keyboard scan start address work vector -- MOS32 0720 D95F ;= NULL -- MOS32 0721 D95F -- MOS32 0722 D95F ; values to be initialised to $FF -- MOS32 0723 D95F 02CE FFBYTE # &00 -- MOS32 0724 D95F ; -- MOS32 0725 D95F 02CE SSEMA # &01 ;sound semaphore -- MOS32 0726 D95F ; -- MOS32 0727 D95F ; buffer activity flags -- MOS32 0728 D95F 02CF BACTIV # &00 -- MOS32 0729 D95F 02CF DUMMY # 3 ;Not used - necessary for padding (see PURGE) -- MOS32 0730 D95F 02D2 PFLAG # &01 ;print flag -- MOS32 0731 D95F ; 1xxx xxxx => dormant MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 55 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0732 D95F ; 0xxx xxxx => busy -- MOS32 0733 D95F 02D3 SFLUSH # &04 ;sound flush flags -- MOS32 0734 D95F 02D7 SPSTAT # &01 ;speech processor status -- MOS32 0735 D95F ; -- MOS32 0736 D95F ; buffer control -- MOS32 0737 D95F ; buffer start page offsets -- MOS32 0738 D95F 02D8 BFSTRT # BUPB+&01 -- MOS32 0739 D95F ; buffer end page offsets -- MOS32 0740 D95F 02E1 BFEND # BUPB+&01 -- MOS32 0741 D95F ; -- MOS32 0742 D95F 02EA CFSA # &03 -- MOS32 0743 D95F -- MOS32 0744 D95F ; -- MOS32 0745 D95F 02ED CFSD # &01 -- MOS32 0746 D95F -- MOS32 0747 D95F 02EE FBLOCK # &12 ;load/save control block -- MOS32 0748 D95F 0000 FSTR * &0000 ;pointer to filename (2 bytes) -- MOS32 0749 D95F 0002 FLOAD * &0002 ;load address (4 bytes) -- MOS32 0750 D95F 0006 FEXEC * &0006 ;execute address (4 bytes) -- MOS32 0751 D95F 000A FFROM * &000A ;from address (4 bytes) -- MOS32 0752 D95F 000E FTO * &000E ;to address (4 bytes) -- MOS32 0753 D95F ;= 18*NULL -- MOS32 0754 D95F -- MOS32 0755 D95F 0300 ZPAGE2 # &00 -- MOS32 0756 D95F -- MOS32 0757 D95F LNK MOS34 -- MOS34 0001 D95F -- MOS34 0002 D95F ; MOS34 -- MOS34 0003 D95F TTL MOS34 Initialisation -- MOS34 0004 D95F OPT MOS34 MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 56 MOS34 MOS34 Initialisation MOS34 -- MOS34 0005 D95F -- MOS34 0006 D95F ;(c) 1981 ACORN Computers Limited -- MOS34 0007 D95F ;BBC Microcomputer MOS -- MOS34 0008 D95F -- MOS34 0009 D95F ;Change record: -- MOS34 0010 D95F ;100 15-Apr-82 PB Use PCEN=1 -- MOS34 0011 D95F ;039 15-Aug-81 PB Start of change to PROTON interface -- MOS34 0012 D95F ;004 29-Jul-81 MP Prototype version -- MOS34 0013 D95F -- MOS34 0014 D95F ;Author(s): -- MOS34 0015 D95F ;PB Paul Bond -- MOS34 0016 D95F ;MP Mike Prees -- MOS34 0017 D95F TTL Entry point after hardware break/reset -- MOS34 0018 D95F OPT OPNEWP MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 57 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0019 D95F -- MOS34 0020 D95F -- MOS34 0021 D95F MRESET ;entered here after reset -- MOS34 0022 D95F -- MOS34 0023 D95F ; ensure NMIs are ignored as sson as possible -- MOS34 0024 D95F ; -- MOS34 0025 D95F A9 40 LDAIM &40 ;A := RTI opcode -- MOS34 0026 D961 8D 00 0D STA NMI -- MOS34 0027 D964 -- MOS34 0028 D964 ; ensure interrupts disabled (useful for JMP -4 freaks) -- MOS34 0029 D964 ; -- MOS34 0030 D964 78 SEI -- MOS34 0031 D965 -- MOS34 0032 D965 ; clear decimal mode -- MOS34 0033 D965 ; -- MOS34 0034 D965 D8 CLD -- MOS34 0035 D966 -- MOS34 0036 D966 ; reset stack -- MOS34 0037 D966 ; -- MOS34 0038 D966 A2 FF LDXIM &FF -- MOS34 0039 D968 9A TXS -- MOS34 0040 D969 -- MOS34 0041 D969 ; push hard reset status -- MOS34 0042 D969 ; -- MOS34 0043 D969 AD 4E FE LDA IERQ -- MOS34 0044 D96C 0A ASLA -- MOS34 0045 D96D 48 PHA ;A=0 => hard, A<>0 => soft -- MOS34 0046 D96E F0 09 BEQ HRDRST ;[hard reset, A=0] MOS34 0046 D96E v76 MOS34 0047 D970 ; MOS34 0046 D96E v76 MOS34 0048 D970 ; prepare for possible soft reset MOS34 0046 D96E v76 MOS34 0049 D970 ; MOS34 0046 D96E v76 MOS34 0050 D970 ; check for critical region MOS34 0046 D96E v76 MOS34 0051 D970 ; MOS34 0046 D96E v76 MOS34 0052 D970 AD 58 02 LDA CRIT MOS34 0046 D96E v76 MOS34 0053 D973 4A LSRA MOS34 0046 D96E v76 MOS34 0054 D974 C9 01 CMPIM &01 MOS34 0046 D96E v76 MOS34 0055 D976 D0 38 BNE SFTRST ;[not within a critical region] MOS34 0055 D976 v47 MOS34 0056 D978 ; A=1 MOS34 0055 D976 v47 MOS34 0057 D978 4A LSRA MOS34 0055 D976 v47 MOS34 0058 D979 ; A=0 MOS34 0055 D976 v47 MOS34 0059 D979 ; MOS34 0055 D976 v47 MOS34 0060 D979 ; within a critical region - clear store MOS34 0055 D976 v47 MOS34 0061 D979 ; MOS34 0055 D976 v47 MOS34 0062 D979 HRDRST ;hard reset MOS34 0055 D976 v47 MOS34 0063 D979 ; A=0 MOS34 0055 D976 v47 MOS34 0064 D979 ; hard reset MOS34 0055 D976 v47 MOS34 0065 D979 ; clear store MOS34 0055 D976 v47 MOS34 0066 D979 [ MOS125 = &FF MOS34 0055 D976 v47 MOS34 0092 D979 ] MOS34 0055 D976 v47 MOS34 0093 D979 MOS34 0055 D976 v47 MOS34 0094 D979 [ MOS125 = &7F MOS34 0055 D976 v47 MOS34 0095 D979 A2 04 LDXIM &04 ;start clearing at page 4 MOS34 0055 D976 v47 MOS34 0096 D97B A8 TAY ;Y := 0 MOS34 0055 D976 v47 MOS34 0097 D97C 85 00 STA &0000 MOS34 0055 D976 v47 MOS34 0098 D97E CLRPG MOS34 0055 D976 v47 MOS34 0099 D97E 86 01 STX &0001 MOS34 0055 D976 v47 MOS34 0100 D980 C8 INY MOS34 0055 D976 v47 MOS34 0101 D981 91 00 STAIY &0000 ;saves 163 ms MOS34 0055 D976 v47 MOS34 0102 D983 E4 01 CPX &0001 MOS34 0055 D976 v47 MOS34 0103 D985 D0 23 BNE CLEAR0 ;[16K RAM] MOS34 0055 D976 v47 MOS34 0104 D987 E8 INX MOS34 0055 D976 v47 MOS34 0105 D988 E0 0D CPXIM /(NMI ) MOS34 0055 D976 v47 MOS34 0106 D98A 85 F2 STA WORK MOS34 0055 D976 v47 MOS34 0107 D98C 86 F3 STX WORK+1 MOS34 0055 D976 v47 MOS34 0108 D98E F0 06 BEQ CLEARA ;leave RTI in place MOS34 0055 D976 v47 MOS34 0109 D990 88 DEY ;otherwise Y=0 MOS34 0055 D976 v47 MOS34 0110 D991 MOS34 0055 D976 v47 MOS34 0111 D991 ; clear store to $00 (no blobs on screen) MOS34 0055 D976 v47 MOS34 0112 D991 ; done: 0000 even . 0 . . MOS34 0055 D976 v47 MOS34 0113 D991 ; X WORK odd x . . . MOS34 0055 D976 v47 MOS34 0114 D991 ; Y MOS34 0055 D976 v47 MOS34 0115 D991 CLEAR MOS34 0055 D976 v47 MOS34 0116 D991 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D976 v47 MOS34 0117 D993 C8 INY ;1 MOS34 0055 D976 v47 MOS34 0118 D994 91 00 STAIY &0000 MOS34 0055 D976 v47 MOS34 0119 D996 CLEARA MOS34 0055 D976 v47 MOS34 0120 D996 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D976 v47 MOS34 0121 D998 C8 INY ;2 MOS34 0055 D976 v47 MOS34 0122 D999 91 00 STAIY &0000 ;saves 24 ms MOS34 0055 D976 v47 MOS34 0123 D99B 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D976 v47 MOS34 0124 D99D C8 INY ;3 MOS34 0055 D976 v47 MOS34 0125 D99E 91 00 STAIY &0000 ;saves 8 ms MOS34 0055 D976 v47 MOS34 0126 D9A0 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D976 v47 MOS34 0127 D9A2 C8 INY ;0 MOS34 0055 D976 v47 MOS34 0128 D9A3 91 00 STAIY &0000 ;saves 4 ms MOS34 0055 D976 v47 MOS34 0129 D9A5 D0 EA BNE CLEAR MOS34 0055 D976 v47 MOS34 0130 D9A7 E8 INX MOS34 0055 D976 v47 MOS34 0131 D9A8 10 D4 BPL CLRPG MOS34 0055 D976 v47 MOS34 0132 D9AA ; 32K RAM MOS34 0055 D976 v47 MOS34 0133 D9AA ; MOS34 0055 D976 v47 MOS34 0134 D9AA CLEAR0 MOS34 0055 D976 v47 MOS34 0135 D9AA ; $0001 = $80 (model B) or $40 (model A) MOS34 0055 D976 v47 MOS34 0136 D9AA 8E 8E 02 STX MODELB MOS34 0055 D976 v47 MOS34 0137 D9AD ; MOS34 0055 D976 v47 MOS34 0138 D9AD ; force soft keys reset MOS34 0055 D976 v47 MOS34 0139 D9AD 8E 84 02 STX USKFLG ;USKFLG := non-zero MOS34 0055 D976 v47 MOS34 0140 D9B0 ] MOS34 0055 D976 v47 MOS34 0141 D9B0 MOS34 0055 D976 v47 MOS34 0142 D9B0 [ MOS125 = &00 MOS34 0055 D976 v47 MOS34 0169 D9B0 ] MOS34 0055 D976 v47 MOS34 0170 D9B0 MOS34 0055 D976 v47 MOS34 0171 D9B0 ; MOS34 0055 D976 v47 MOS34 0172 D9B0 SFTRST MOS34 0055 D976 v47 MOS34 0173 D9B0 ; MOS34 0055 D976 v47 MOS34 0174 D9B0 ; initialise addressable latch outputs hi MOS34 0055 D976 v47 MOS34 0175 D9B0 ; MOS34 0055 D976 v47 MOS34 0176 D9B0 A2 0F LDXIM &0F ;for latch driving -- MOS34 0177 D9B2 8E 42 FE STX DDRBQ ;set PB3-PB0 as outputs to drive addressable latch -- MOS34 0178 D9B5 ; -- MOS34 0179 D9B5 IALTCH -- MOS34 0180 D9B5 CA DEX MOS34 0183 D9BB ^78 MOS34 0181 D9B6 8E 40 FE STX PBQ ;first store value = $0E, last store value = $08 MOS34 0183 D9BB ^78 MOS34 0182 D9B9 E0 09 CPXIM &09 MOS34 0183 D9BB ^78 MOS34 0183 D9BB B0 F8 BCS IALTCH -- MOS34 0184 D9BD ; fall thru when X=$08 -- MOS34 0185 D9BD -- MOS34 0186 D9BD -- MOS34 0187 D9BD ; check for hard restart -- MOS34 0188 D9BD ; -- MOS34 0189 D9BD ; read start-up options -- MOS34 0190 D9BD ; MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 58 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0191 D9BD E8 INX ;X := $09, scan down from last start-up option -- MOS34 0192 D9BE ; -- MOS34 0193 D9BE RDOPT1 -- MOS34 0194 D9BE 8A TXA ;save X in A MOS34 0203 D9C8 ^74 MOS34 0195 D9BF 20 39 F0 JSR KC ;read state of matrix element addressed by X (A maintained) MOS34 0203 D9C8 ^74 MOS34 0196 D9C2 ; MOS34 0203 D9C8 ^74 MOS34 0197 D9C2 ; N.B. does not corrupt A MOS34 0203 D9C8 ^74 MOS34 0198 D9C2 ; MOS34 0203 D9C8 ^74 MOS34 0199 D9C2 E0 80 CPXIM &80 ;C=0 => option open, C=1 => option closed MOS34 0203 D9C8 ^74 MOS34 0200 D9C4 66 FC ROR TEMPA ;rotate state of start-up option into TEMPA byte MOS34 0203 D9C8 ^74 MOS34 0201 D9C6 AA TAX ;restore X MOS34 0203 D9C8 ^74 MOS34 0202 D9C7 CA DEX MOS34 0203 D9C8 ^74 MOS34 0203 D9C8 D0 F4 BNE RDOPT1 ;execute loop 9 times -- MOS34 0204 D9CA ; -- MOS34 0205 D9CA ; N.B. exits with X=0, SHIFT key has not been scanned -- MOS34 0206 D9CA ; state of CTRL key has been rotated into TEMPA -- MOS34 0207 D9CA ; -- MOS34 0208 D9CA 8E 8D 02 STX TYPE ;restart type := 0 -- MOS34 0209 D9CD 26 FC ROL TEMPA ;C = state of CTRL key, TEMPA = start-up options -- MOS34 0210 D9CF 20 04 EF JSR KBDIS ;disable keyboard (and resume hardware scan) -- MOS34 0211 D9D2 ; -- MOS34 0212 D9D2 6A RORA ;C=1 => CTRL pressed (KBDIS does PHP ... PLA) -- MOS34 0213 D9D3 ; -- MOS34 0214 D9D3 A2 9C LDXIM CPAGE2 ;(do not set to reset timer if soft restart) -- MOS34 0215 D9D5 A0 8D LDYIM NPAGE2 ;reset BREAKI if power up -- MOS34 0216 D9D7 68 PLA ;pull hard restart status -- MOS34 0217 D9D8 F0 09 BEQ POWER ;[power up] MOS34 0217 D9D8 v76 MOS34 0218 D9DA ; MOS34 0217 D9D8 v76 MOS34 0219 D9DA A0 7E LDYIM MPAGE2 ;prepare for BREAK MOS34 0217 D9D8 v76 MOS34 0220 D9DC 90 11 BCC SOFT ;[CTRL not pressed - force soft reset, b1b0(TYPE) := 0] MOS34 0220 D9DC v6E MOS34 0221 D9DE ; MOS34 0220 D9DC v6E MOS34 0222 D9DE ; b1b0(TYPE) := 2 MOS34 0220 D9DC v6E MOS34 0223 D9DE ; MOS34 0220 D9DC v6E MOS34 0224 D9DE A0 87 LDYIM PPAGE2 ;CTRL/BREAK MOS34 0220 D9DC v6E MOS34 0225 D9E0 EE 8D 02 INC TYPE MOS34 0220 D9DC v6E MOS34 0226 D9E3 ; MOS34 0220 D9DC v6E MOS34 0227 D9E3 POWER ;power up, b1b0(TYPE) := 1 MOS34 0220 D9DC v6E MOS34 0228 D9E3 ;HARD ;hard restart MOS34 0220 D9DC v6E MOS34 0229 D9E3 EE 8D 02 INC TYPE MOS34 0220 D9DC v6E MOS34 0230 D9E6 ; MOS34 0220 D9DC v6E MOS34 0231 D9E6 ; initialise OPTION MOS34 0220 D9DC v6E MOS34 0232 D9E6 ; MOS34 0220 D9DC v6E MOS34 0233 D9E6 A5 FC LDA TEMPA MOS34 0220 D9DC v6E MOS34 0234 D9E8 49 FF EORIM &FF ;invert VDU mode selection MOS34 0220 D9DC v6E MOS34 0235 D9EA 8D 8F 02 STA OPTION MOS34 0220 D9DC v6E MOS34 0236 D9ED ; MOS34 0220 D9DC v6E MOS34 0237 D9ED A2 90 LDXIM DPAGE2 ;set to reset timer MOS34 0220 D9DC v6E MOS34 0238 D9EF MOS34 0220 D9DC v6E MOS34 0239 D9EF MOS34 0220 D9DC v6E MOS34 0240 D9EF SOFT MOS34 0220 D9DC v6E MOS34 0241 D9EF ; initialise other page two locations to zero/$FF MOS34 0220 D9DC v6E MOS34 0242 D9EF ; N.B. X has been set to an appropriate value MOS34 0220 D9DC v6E MOS34 0243 D9EF A9 00 LDAIM ZERO -- MOS34 0244 D9F1 IP0SX -- MOS34 0245 D9F1 E0 CE CPXIM FFBYTE MOS34 0258 DA00 ^6F MOS34 0246 D9F3 [ MOS125 = &FF MOS34 0258 DA00 ^6F MOS34 0249 D9F3 | MOS34 0258 DA00 ^6F MOS34 0250 D9F3 D0 07 BNE Z0BYTE MOS34 0258 DA00 ^6F MOS34 0251 D9F5 A9 FF LDAIM &FF MOS34 0258 DA00 ^6F MOS34 0252 D9F7 8D CE 02 STA SSEMA MOS34 0258 DA00 ^6F MOS34 0253 D9FA A2 D2 LDXIM PFLAG MOS34 0258 DA00 ^6F MOS34 0254 D9FC ] MOS34 0258 DA00 ^6F MOS34 0255 D9FC Z0BYTE MOS34 0258 DA00 ^6F MOS34 0256 D9FC 9D 00 02 STAAX &0200 MOS34 0258 DA00 ^6F MOS34 0257 D9FF E8 INX MOS34 0258 DA00 ^6F MOS34 0258 DA00 D0 EF BNE IP0SX -- MOS34 0259 DA02 ; N.B. A=$FF, X=0 -- MOS34 0260 DA02 8D 63 FE STA DDRAR ;set all outputs on printer data direction register (6522B) -- MOS34 0261 DA05 -- MOS34 0262 DA05 -- MOS34 0263 DA05 ; initialise page zero locations to zero -- MOS34 0264 DA05 ; -- MOS34 0265 DA05 8A TXA ;A := 0 -- MOS34 0266 DA06 A2 E2 LDXIM BPAGE0 -- MOS34 0267 DA08 IP0SW -- MOS34 0268 DA08 95 00 STAAX ZERO MOS34 0270 DA0B ^7B MOS34 0269 DA0A E8 INX MOS34 0270 DA0B ^7B MOS34 0270 DA0B D0 FB BNE IP0SW -- MOS34 0271 DA0D ; X=0 -- MOS34 0272 DA0D -- MOS34 0273 DA0D -- MOS34 0274 DA0D ; initialise page two specific values -- MOS34 0275 DA0D ; -- MOS34 0276 DA0D IP2SV -- MOS34 0277 DA0D B9 D1 D8 LDAAY IPAGE2 -&01 MOS34 0280 DA14 ^77 MOS34 0278 DA10 99 FF 01 STAAY APAGE2 -&01 MOS34 0280 DA14 ^77 MOS34 0279 DA13 88 DEY MOS34 0280 DA14 ^77 MOS34 0280 DA14 D0 F7 BNE IP2SV -- MOS34 0281 DA16 ; Y=0 -- MOS34 0282 DA16 -- MOS34 0283 DA16 -- MOS34 0284 DA16 ; make old key space in case CFS auto-boot selected -- MOS34 0285 DA16 ; -- MOS34 0286 DA16 A9 62 LDAIM &62 -- MOS34 0287 DA18 85 ED STA OKEY -- MOS34 0288 DA1A ; X=0, Y=0 -- MOS34 0289 DA1A -- MOS34 0290 DA1A -- MOS34 0291 DA1A ; setup MC6850 -- MOS34 0292 DA1A ; -- MOS34 0293 DA1A 20 FD FA JSR MC6850 ;N.B. does not corrupt X or Y -- MOS34 0294 DA1D ; X=0, Y=0 -- MOS34 0295 DA1D -- MOS34 0296 DA1D -- MOS34 0297 DA1D ; clear any 6522 interrupt status -- MOS34 0298 DA1D ; -- MOS34 0299 DA1D A9 7F LDAIM &7F -- MOS34 0300 DA1F E8 INX ;X=1 -- MOS34 0301 DA20 IFRIER ;X=1 initialises IERQ&IERR, X=0 initialises IFRQ&IFRR -- MOS34 0302 DA20 9D 4D FE STAAX IFRQ MOS34 0305 DA27 ^77 MOS34 0303 DA23 9D 6D FE STAAX IFRR MOS34 0305 DA27 ^77 MOS34 0304 DA26 CA DEX MOS34 0305 DA27 ^77 MOS34 0305 DA27 10 F7 BPL IFRIER ;[execute loop once more with X=0] -- MOS34 0306 DA29 ; X=$FF -- MOS34 0307 DA29 ; -- MOS34 0308 DA29 [ FALSE=0 -- MOS34 0311 DA29 ] -- MOS34 0312 DA29 -- MOS34 0313 DA29 ; TEMPA is now 0 -- MOS34 0314 DA29 ; if an interrupt occurs it will adopt the value $7F -- MOS34 0315 DA29 ; MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 59 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0316 DA29 ; allow test equipment to interrupt if present -- MOS34 0317 DA29 ; -- MOS34 0318 DA29 58 CLI -- MOS34 0319 DA2A ; ** TEST EQUIPMENT INTERRUPT MAY OCCUR HERE ** -- MOS34 0320 DA2A 78 SEI -- MOS34 0321 DA2B ; -- MOS34 0322 DA2B 24 FC BIT TEMPA -- MOS34 0323 DA2D 50 03 BVC NOTST1 MOS34 0323 DA2D v7C MOS34 0324 DA2F ; C=0 MOS34 0323 DA2D v7C MOS34 0325 DA2F 20 64 F0 JSR JMITST ;enter test routine (first call) MOS34 0323 DA2D v7C MOS34 0326 DA32 NOTST1 MOS34 0323 DA2D v7C MOS34 0327 DA32 MOS34 0323 DA2D v7C MOS34 0328 DA32 MOS34 0323 DA2D v7C MOS34 0329 DA32 [ FALSE=0 MOS34 0323 DA2D v7C MOS34 0348 DA32 ] MOS34 0323 DA2D v7C MOS34 0349 DA32 MOS34 0323 DA2D v7C MOS34 0350 DA32 MOS34 0323 DA2D v7C MOS34 0351 DA32 ; initialise 6522s MOS34 0323 DA2D v7C MOS34 0352 DA32 ; MOS34 0323 DA2D v7C MOS34 0353 DA32 A2 F2 LDXIM &F2 ;enable TIMER1(clock,40), TIMER2(speech,20) -- MOS34 0354 DA34 ; CB1(ADC,10), CA1(VSYNC,02) and NOT[CA2(keyboard,01)] -- MOS34 0355 DA34 8E 4E FE STX IERQ -- MOS34 0356 DA37 -- MOS34 0357 DA37 -- MOS34 0358 DA37 ; initialise peripheral control register -- MOS34 0359 DA37 ; -- MOS34 0360 DA37 A2 04 LDXIM &04 -- MOS34 0361 DA39 8E 4C FE STX PCRQ ;select CA2 positive active edge -- MOS34 0362 DA3C -- MOS34 0363 DA3C -- MOS34 0364 DA3C ; setup centisecond timer -- MOS34 0365 DA3C ; -- MOS34 0366 DA3C A9 60 LDAIM &60 ;TIMER1 continuous, TIMER2 count pulses on PB6 -- MOS34 0367 DA3E 8D 4B FE STA ACRQ -- MOS34 0368 DA41 -- MOS34 0369 DA41 -- MOS34 0370 DA41 ; N.B. ACRR zeroed by reset -- MOS34 0371 DA41 ; -- MOS34 0372 DA41 ; set timer hi-byte -- MOS34 0373 DA41 ; -- MOS34 0374 DA41 A9 0E LDAIM &0E ;timer 1 period = 998 usec -- MOS34 0375 DA43 8D 46 FE STA TQLLQ -- MOS34 0376 DA46 8D 6C FE STA PCRR ;set CA2 hi (for printer) -- MOS34 0377 DA49 ; -- MOS34 0378 DA49 ; start conversion on analog/digital chip -- MOS34 0379 DA49 ; -- MOS34 0380 DA49 8D C0 FE STA ADCCTL ;12 bits from chip channel 2 -- MOS34 0381 DA4C -- MOS34 0382 DA4C -- MOS34 0383 DA4C ; check whether 6522B present -- MOS34 0384 DA4C ; -- MOS34 0385 DA4C CD 6C FE CMP PCRR -- MOS34 0386 DA4F F0 03 BEQ B6522E ;[6522B exists] MOS34 0386 DA4F v7C MOS34 0387 DA51 ; MOS34 0386 DA4F v7C MOS34 0388 DA51 ; 6522B does not exist MOS34 0386 DA4F v7C MOS34 0389 DA51 ; MOS34 0386 DA4F v7C MOS34 0390 DA51 EE 77 02 INC B6522 ;B6522 := $00 MOS34 0386 DA4F v7C MOS34 0391 DA54 B6522E MOS34 0386 DA4F v7C MOS34 0392 DA54 ; MOS34 0386 DA4F v7C MOS34 0393 DA54 ; set timer lo-byte MOS34 0386 DA4F v7C MOS34 0394 DA54 ; MOS34 0386 DA4F v7C MOS34 0395 DA54 A9 27 LDAIM &27 -- MOS34 0396 DA56 8D 47 FE STA TQLHQ -- MOS34 0397 DA59 8D 45 FE STA TQCHQ -- MOS34 0398 DA5C -- MOS34 0399 DA5C -- MOS34 0400 DA5C ; kill sound -- MOS34 0401 DA5C ; -- MOS34 0402 DA5C 20 86 EC JSR SNDRST -- MOS34 0403 DA5F -- MOS34 0404 DA5F -- MOS34 0405 DA5F ; ensure motor off -- MOS34 0406 DA5F ; reinitialise serproc -- MOS34 0407 DA5F ; -- MOS34 0408 DA5F AD 82 02 LDA SPREGA -- MOS34 0409 DA62 29 7F ANDIM &7F -- MOS34 0410 DA64 20 E9 E6 JSR STASP ;STA SPREGA, STA SERPRC -- MOS34 0411 DA67 ; X, Y corrupted -- MOS34 0412 DA67 -- MOS34 0413 DA67 -- MOS34 0414 DA67 ; conditionally reset soft keys -- MOS34 0415 DA67 ; soft keys are reset -- MOS34 0416 DA67 ; (a) after a hard reset -- MOS34 0417 DA67 ; (b) if reset occurred during a critical update of the soft keys -- MOS34 0418 DA67 ; -- MOS34 0419 DA67 AE 84 02 LDX USKFLG -- MOS34 0420 DA6A F0 03 BEQ SKOK MOS34 0420 DA6A v7C MOS34 0421 DA6C 20 CD E9 JSR RSOFT ;reset soft keys, sets X=0 MOS34 0420 DA6A v7C MOS34 0422 DA6F SKOK MOS34 0420 DA6A v7C MOS34 0423 DA6F ; X=0 MOS34 0420 DA6A v7C MOS34 0424 DA6F MOS34 0420 DA6A v7C MOS34 0425 DA6F MOS34 0420 DA6A v7C MOS34 0426 DA6F ; compare ROMs MOS34 0420 DA6A v7C MOS34 0427 DA6F ; MOS34 0420 DA6A v7C MOS34 0428 DA6F CRX MOS34 0420 DA6A v7C MOS34 0429 DA6F 20 DB DB JSR STXROM ;select ROM MOS34 0486 DAC1 ^2C MOS34 0430 DA72 ; MOS34 0486 DAC1 ^2C MOS34 0431 DA72 ; check for copyright string MOS34 0486 DAC1 ^2C MOS34 0432 DA72 ; MOS34 0486 DAC1 ^2C MOS34 0433 DA72 A2 03 LDXIM &03 MOS34 0486 DAC1 ^2C MOS34 0434 DA74 AC 07 80 LDY COPYRP MOS34 0486 DAC1 ^2C MOS34 0435 DA77 CRCPYR MOS34 0486 DAC1 ^2C MOS34 0436 DA77 B9 00 80 LDAAY LANG MOS34 0486 DAC1 ^2C MOS34 0437 DA7A DD 29 F5 CMPAX COPYR MOS34 0486 DAC1 ^2C MOS34 0438 DA7D D0 2E BNE CRBAD MOS34 0486 DAC1 ^2C MOS34 0439 DA7F C8 INY MOS34 0486 DAC1 ^2C MOS34 0440 DA80 CA DEX MOS34 0486 DAC1 ^2C MOS34 0441 DA81 10 F4 BPL CRCPYR MOS34 0486 DAC1 ^2C MOS34 0442 DA83 ; MOS34 0486 DAC1 ^2C MOS34 0443 DA83 ; ROM has copyright string MOS34 0486 DAC1 ^2C MOS34 0444 DA83 ; MOS34 0486 DAC1 ^2C MOS34 0445 DA83 A6 F4 LDX ROMID MOS34 0486 DAC1 ^2C MOS34 0446 DA85 A4 F4 LDY ROMID MOS34 0486 DAC1 ^2C MOS34 0447 DA87 CRY MOS34 0486 DAC1 ^2C MOS34 0448 DA87 C8 INY MOS34 0486 DAC1 ^2C MOS34 0449 DA88 C0 10 CPYIM NROM MOS34 0486 DAC1 ^2C MOS34 0450 DA8A B0 25 BCS CRNX ;[Y > number of ROMs] MOS34 0486 DAC1 ^2C MOS34 0451 DA8C 98 TYA MOS34 0486 DAC1 ^2C MOS34 0452 DA8D 49 FF EORIM &FF MOS34 0486 DAC1 ^2C MOS34 0453 DA8F 85 FA STA CRLO MOS34 0486 DAC1 ^2C MOS34 0454 DA91 A9 7F LDAIM &7F ;N.B. this is LANG / - 1 MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 60 MOS34 Entry point after hardware break/reset MOS34 MOS34 0486 DAC1 ^2C MOS34 0455 DA93 85 FB STA CRHI MOS34 0486 DAC1 ^2C MOS34 0456 DA95 CRLOOP MOS34 0486 DAC1 ^2C MOS34 0457 DA95 8C 30 FE STY ROM ;select second (Y) ROM MOS34 0486 DAC1 ^2C MOS34 0458 DA98 B1 FA LDAIY CRLO MOS34 0486 DAC1 ^2C MOS34 0459 DA9A 8E 30 FE STX ROM ;select first (X) ROM MOS34 0486 DAC1 ^2C MOS34 0460 DA9D D1 FA CMPIY CRLO MOS34 0486 DAC1 ^2C MOS34 0461 DA9F D0 E6 BNE CRY ;[ROMs do not match] MOS34 0486 DAC1 ^2C MOS34 0462 DAA1 E6 FA INC CRLO MOS34 0486 DAC1 ^2C MOS34 0463 DAA3 D0 F0 BNE CRLOOP MOS34 0486 DAC1 ^2C MOS34 0464 DAA5 E6 FB INC CRHI MOS34 0486 DAC1 ^2C MOS34 0465 DAA7 A5 FB LDA CRHI MOS34 0486 DAC1 ^2C MOS34 0466 DAA9 C9 84 CMPIM &84 ;compare only first 1K of ROMs MOS34 0486 DAC1 ^2C MOS34 0467 DAAB 90 E8 BCC CRLOOP MOS34 0486 DAC1 ^2C MOS34 0468 DAAD ; ROMs match MOS34 0486 DAC1 ^2C MOS34 0469 DAAD CRBAD MOS34 0486 DAC1 ^2C MOS34 0470 DAAD A6 F4 LDX ROMID MOS34 0486 DAC1 ^2C MOS34 0471 DAAF 10 0D BPL CRNX1 ;[ALWAYS jump] MOS34 0486 DAC1 ^2C MOS34 0472 DAB1 ; NEVER fall thru MOS34 0486 DAC1 ^2C MOS34 0473 DAB1 ; MOS34 0486 DAC1 ^2C MOS34 0474 DAB1 CRNX MOS34 0486 DAC1 ^2C MOS34 0475 DAB1 AD 06 80 LDA ROMTYP MOS34 0486 DAC1 ^2C MOS34 0476 DAB4 9D A1 02 STAAX ROMS ;store type of recognised ROM MOS34 0486 DAC1 ^2C MOS34 0477 DAB7 ; check for BASIC ROM MOS34 0486 DAC1 ^2C MOS34 0478 DAB7 ;***** N.B. WHITE BASIC MAY NEED 'ANDIM $FE' ***** MOS34 0486 DAC1 ^2C MOS34 0479 DAB7 29 8F ANDIM &8F MOS34 0486 DAC1 ^2C MOS34 0480 DAB9 D0 03 BNE CRNX1 ;[not a BASIC ROM] MOS34 0486 DAC1 ^2C MOS34 0481 DABB ; BASIC ROM - remember ROM id for *BASIC command MOS34 0486 DAC1 ^2C MOS34 0482 DABB 8E 4B 02 STX BROMID MOS34 0486 DAC1 ^2C MOS34 0483 DABE CRNX1 MOS34 0486 DAC1 ^2C MOS34 0484 DABE E8 INX MOS34 0486 DAC1 ^2C MOS34 0485 DABF E0 10 CPXIM NROM MOS34 0486 DAC1 ^2C MOS34 0486 DAC1 90 AC BCC CRX ;[X a valid ROM number] -- MOS34 0487 DAC3 -- MOS34 0488 DAC3 [ NOSP = &00 -- MOS34 0490 DAC3 | -- MOS34 0491 DAC3 ; X=NROM -- MOS34 0492 DAC3 ; -- MOS34 0493 DAC3 ; if speech chip ready is still high then the chip has not been fitted -- MOS34 0494 DAC3 ; -- MOS34 0495 DAC3 2C 40 FE BIT PBQ -- MOS34 0496 DAC6 30 11 BMI START1 ;[chip does not exist] MOS34 0496 DAC6 v6E MOS34 0497 DAC8 ; X=NROM MOS34 0496 DAC6 v6E MOS34 0498 DAC8 ; speech chip present MOS34 0496 DAC6 v6E MOS34 0499 DAC8 ; MOS34 0496 DAC6 v6E MOS34 0500 DAC8 CE 7B 02 DEC SPFLAG ;SPFLAG := $FF MOS34 0496 DAC6 v6E MOS34 0501 DACB ; X=NROM MOS34 0496 DAC6 v6E MOS34 0502 DACB ; reset speech processor MOS34 0496 DAC6 v6E MOS34 0503 DACB ; MOS34 0496 DAC6 v6E MOS34 0504 DACB ; write NROM * $FF (reset) to speech processor MOS34 0496 DAC6 v6E MOS34 0505 DACB SPRST1 MOS34 0496 DAC6 v6E MOS34 0506 DACB A0 FF LDYIM SPOPRT MOS34 0496 DAC6 v6E MOS34 0507 DACD 20 9B EE JSR WSPECH ;N.B. corrupts A and Y MOS34 0496 DAC6 v6E MOS34 0508 DAD0 CA DEX MOS34 0496 DAC6 v6E MOS34 0509 DAD1 D0 F8 BNE SPRST1 MOS34 0496 DAC6 v6E MOS34 0510 DAD3 ; X=0 MOS34 0496 DAC6 v6E MOS34 0511 DAD3 ; MOS34 0496 DAC6 v6E MOS34 0512 DAD3 8E 48 FE STX TRCLQ MOS34 0496 DAC6 v6E MOS34 0513 DAD6 8E 49 FE STX TRCHQ ;enable interrupt after one negative pulse on PB6 (speech int) MOS34 0496 DAC6 v6E MOS34 0514 DAD9 ] MOS34 0496 DAC6 v6E MOS34 0515 DAD9 MOS34 0496 DAC6 v6E MOS34 0516 DAD9 START1 MOS34 0496 DAC6 v6E MOS34 0517 DAD9 MOS34 0496 DAC6 v6E MOS34 0518 DAD9 MOS34 0496 DAC6 v6E MOS34 0519 DAD9 AD 8F 02 LDA OPTION ;initialise graphics mode from start-up options -- MOS34 0520 DADC 20 00 C3 JSR VDINIT ;initialise VDU module -- MOS34 0521 DADF -- MOS34 0522 DADF -- MOS34 0523 DADF ; set up reset soft key (fA) -- MOS34 0524 DADF ; -- MOS34 0525 DADF A0 CA LDYIM BREKEY -- MOS34 0526 DAE1 20 34 E5 JSR RDCHS ;set to expand softkeyA immediately -- MOS34 0527 DAE4 ; C=0 cos buffer empty -- MOS34 0528 DAE4 ; -- MOS34 0529 DAE4 ; let user intercept BREAK -- MOS34 0530 DAE4 ; -- MOS34 0531 DAE4 ; C=0 -- MOS34 0532 DAE4 20 25 EB JSR BREAK -- MOS34 0533 DAE7 ; -- MOS34 0534 DAE7 ; initialise CFS state -- MOS34 0535 DAE7 ; -- MOS34 0536 DAE7 20 4C F1 JSR INIT -- MOS34 0537 DAEA ; -- MOS34 0538 DAEA ; check for tube -- MOS34 0539 DAEA ; -- MOS34 0540 DAEA A9 81 LDAIM &81 -- MOS34 0541 DAEC 8D E0 FE STA TREG0 -- MOS34 0542 DAEF AD E0 FE LDA TREG0 -- MOS34 0543 DAF2 6A RORA -- MOS34 0544 DAF3 90 0A BCC NOTUBE ;[tube not present] MOS34 0544 DAF3 v75 MOS34 0545 DAF5 ; MOS34 0544 DAF3 v75 MOS34 0546 DAF5 ; tube present MOS34 0544 DAF3 v75 MOS34 0547 DAF5 ; MOS34 0544 DAF3 v75 MOS34 0548 DAF5 A2 FF LDXIM SVTUBE MOS34 0544 DAF3 v75 MOS34 0549 DAF7 20 74 F1 JSR SVOP ;initialise tube MOS34 0544 DAF3 v75 MOS34 0550 DAFA D0 03 BNE NOTUBE ;[tube software not present] MOS34 0544 DAF3 v75 MOS34 0551 DAFC CE 7A 02 DEC TUBEM ;TUBEM := $FF MOS34 0544 DAF3 v75 MOS34 0552 DAFF NOTUBE MOS34 0544 DAF3 v75 MOS34 0553 DAFF ; MOS34 0544 DAF3 v75 MOS34 0554 DAFF ; initialise service ROMs before writing to screen MOS34 0544 DAF3 v75 MOS34 0555 DAFF ; MOS34 0544 DAF3 v75 MOS34 0556 DAFF A0 0E LDYIM /(OSHWM ) ;Y := default high water mark -- MOS34 0557 DB01 ; -- MOS34 0558 DB01 A2 01 LDXIM SVSTAT ;offer static area -- MOS34 0559 DB03 20 74 F1 JSR SVOP -- MOS34 0560 DB06 ; -- MOS34 0561 DB06 A2 02 LDXIM SVDYN ;offer dynamic area -- MOS34 0562 DB08 20 74 F1 JSR SVOP -- MOS34 0563 DB0B ; -- MOS34 0564 DB0B 8C 43 02 STY IHWM ;save adjusted high water mark -- MOS34 0565 DB0E 8C 44 02 STY HWM ;save adjusted high water mark -- MOS34 0566 DB11 ; -- MOS34 0567 DB11 ; allow tube post-initialisation (e.g. exploding font) -- MOS34 0568 DB11 ; -- MOS34 0569 DB11 A2 FE LDXIM SVTPIN ;******** ASSUMED = $FE ******** -- MOS34 0570 DB13 AC 7A 02 LDY TUBEM ;pass tube flag as argument -- MOS34 0571 DB16 20 74 F1 JSR SVOP -- MOS34 0572 DB19 ; A=$00 (tube present) -- MOS34 0573 DB19 ; A=$FF (tube not present) -- MOS34 0574 DB19 ; -- MOS34 0575 DB19 ; conditionally output start-up message -- MOS34 0576 DB19 ; 'BBC Computer' MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 61 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0577 DB19 ; -- MOS34 0578 DB19 2D 67 02 AND QUIET ;may be set by paged ROM -- MOS34 0579 DB1C 10 1B BPL ENTER ;[shshh ... you know who] MOS34 0579 DB1C v64 MOS34 0580 DB1E ; MOS34 0579 DB1C v64 MOS34 0581 DB1E ; output start up message MOS34 0579 DB1C v64 MOS34 0582 DB1E ; MOS34 0579 DB1C v64 MOS34 0583 DB1E A0 02 LDYIM MSGBBC-&01 MOS34 0579 DB1C v64 MOS34 0584 DB20 20 55 DE JSR WRSTR MOS34 0579 DB1C v64 MOS34 0585 DB23 ; MOS34 0579 DB1C v64 MOS34 0586 DB23 ; indicate model type MOS34 0579 DB1C v64 MOS34 0587 DB23 ; MOS34 0579 DB1C v64 MOS34 0588 DB23 AD 8D 02 LDA TYPE MOS34 0579 DB1C v64 MOS34 0589 DB26 F0 0C BEQ Z ;[soft restart] MOS34 0579 DB1C v64 MOS34 0590 DB28 ; MOS34 0579 DB1C v64 MOS34 0591 DB28 ; hard restart MOS34 0579 DB1C v64 MOS34 0592 DB28 ; complete message MOS34 0579 DB1C v64 MOS34 0593 DB28 ; MOS34 0579 DB1C v64 MOS34 0594 DB28 A0 16 LDYIM MSG32K-&01 MOS34 0579 DB1C v64 MOS34 0595 DB2A 2C 8E 02 BIT MODELB MOS34 0579 DB1C v64 MOS34 0596 DB2D 30 02 BMI B ;[model B] MOS34 0579 DB1C v64 MOS34 0597 DB2F ; MOS34 0579 DB1C v64 MOS34 0598 DB2F ; model A MOS34 0579 DB1C v64 MOS34 0599 DB2F ; MOS34 0579 DB1C v64 MOS34 0600 DB2F A0 11 LDYIM MSG16K-&01 MOS34 0579 DB1C v64 MOS34 0601 DB31 B MOS34 0579 DB1C v64 MOS34 0602 DB31 20 55 DE JSR WRSTR MOS34 0579 DB1C v64 MOS34 0603 DB34 Z MOS34 0579 DB1C v64 MOS34 0604 DB34 A0 1B LDYIM MSG2CR-&01 MOS34 0579 DB1C v64 MOS34 0605 DB36 20 55 DE JSR WRSTR MOS34 0579 DB1C v64 MOS34 0606 DB39 ; MOS34 0579 DB1C v64 MOS34 0607 DB39 ENTER ;initialise TAPE/DISC MOS34 0579 DB1C v64 MOS34 0608 DB39 ; MOS34 0579 DB1C v64 MOS34 0609 DB39 ; let user intercept BREAK after filing system initialisation MOS34 0579 DB1C v64 MOS34 0610 DB39 ; MOS34 0579 DB1C v64 MOS34 0611 DB39 38 SEC -- MOS34 0612 DB3A 20 25 EB JSR BREAK -- MOS34 0613 DB3D ; -- MOS34 0614 DB3D ; service ROMs again -- MOS34 0615 DB3D ; test for auto-boot condition (SHIFT and startup option bit3) -- MOS34 0616 DB3D ; -- MOS34 0617 DB3D 20 DE E9 JSR MOSTST ;test shift -- MOS34 0618 DB40 [ MOS125 = &FF -- MOS34 0621 DB40 | -- MOS34 0622 DB40 ;Slightly iffy using A directly as no other callers of MOSTST do -- MOS34 0623 DB40 ;however MOSTST always returns SHIFT state in both N and A b7 -- MOS34 0624 DB40 ] -- MOS34 0625 DB40 4A LSRA -- MOS34 0626 DB41 4A LSRA -- MOS34 0627 DB42 4A LSRA -- MOS34 0628 DB43 4A LSRA -- MOS34 0629 DB44 4D 8F 02 EOR OPTION -- MOS34 0630 DB47 29 08 ANDIM &08 ;use bit3 -- MOS34 0631 DB49 A8 TAY ;Y=0 => auto-boot, Y<>0 => do not auto-boot -- MOS34 0632 DB4A A2 03 LDXIM SVBOOT ;offer bootstrap -- MOS34 0633 DB4C 20 74 F1 JSR SVOP -- MOS34 0634 DB4F F0 30 BEQ SLANG ;[file system booted] MOS34 0634 DB4F v4F MOS34 0635 DB51 ; MOS34 0634 DB4F v4F MOS34 0636 DB51 ; file system not booted - try to auto-boot from SEROM MOS34 0634 DB4F v4F MOS34 0637 DB51 ; MOS34 0634 DB4F v4F MOS34 0638 DB51 98 TYA MOS34 0634 DB4F v4F MOS34 0639 DB52 D0 27 BNE NOAUTO ;[do not auto boot] MOS34 0634 DB4F v4F MOS34 0640 DB54 ; MOS34 0634 DB4F v4F MOS34 0641 DB54 ; auto-boot from SEROM MOS34 0634 DB4F v4F MOS34 0642 DB54 ; MOS34 0634 DB4F v4F MOS34 0643 DB54 A9 8D LDAIM FXSROM MOS34 0634 DB4F v4F MOS34 0644 DB56 20 41 F1 JSR CROM ;'*ROM' MOS34 0634 DB4F v4F MOS34 0645 DB59 A2 1E LDXIM SLBOOT MOS34 0634 DB4F v4F MOS34 0646 DB5B A0 EB LDYIM /(SLBOOT ) MOS34 0634 DB4F v4F MOS34 0647 DB5D CE 67 02 DEC QUIET ;flag as loading auto-boot program MOS34 0634 DB4F v4F MOS34 0648 DB60 20 F7 FF JSR OSCLI ;'/!BOOT' MOS34 0634 DB4F v4F MOS34 0649 DB63 EE 67 02 INC QUIET ;flag as not loading auto-boot program MOS34 0634 DB4F v4F MOS34 0650 DB66 ; if an error occurs whilst running the !BOOT program MOS34 0634 DB4F v4F MOS34 0651 DB66 ; then the MOS jumps to EBRK (early BRK) MOS34 0634 DB4F v4F MOS34 0652 DB66 D0 19 BNE DNRFS ;[ALWAYS jump, do not reset filing system] MOS34 0634 DB4F v4F MOS34 0653 DB68 ; MOS34 0634 DB4F v4F MOS34 0654 DB68 [ MOS125 = &FF MOS34 0634 DB4F v4F MOS34 0655 DB68 | MOS34 0634 DB4F v4F MOS34 0656 DB68 ;Restoring OS 1.20 behaviour: MOS34 0634 DB4F v4F MOS34 0657 DB68 ;*FX215,0 by early birds (or *FX215,255 by RFS !BOOT) MOS34 0634 DB4F v4F MOS34 0658 DB68 ;forces *TAPE12 on successful completion of RFS !BOOT MOS34 0634 DB4F v4F MOS34 0659 DB68 ;with no error message printed MOS34 0634 DB4F v4F MOS34 0660 DB68 F0 11 BEQ NOAUTO MOS34 0634 DB4F v4F MOS34 0661 DB6A ;NEVER fall through MOS34 0634 DB4F v4F MOS34 0662 DB6A MOS34 0634 DB4F v4F MOS34 0663 DB6A DEFBRK ;default BRK routine outputs error message MOS34 0634 DB4F v4F MOS34 0664 DB6A ; assume still decimal mode MOS34 0634 DB4F v4F MOS34 0665 DB6A A0 00 LDYIM ZERO MOS34 0634 DB4F v4F MOS34 0666 DB6C 20 5D DE JSR WRSTR1 ;output error message MOS34 0634 DB4F v4F MOS34 0667 DB6F ; check whether within auto-boot program MOS34 0634 DB4F v4F MOS34 0668 DB6F AD 67 02 LDA QUIET MOS34 0634 DB4F v4F MOS34 0669 DB72 6A RORA MOS34 0634 DB4F v4F MOS34 0670 DB73 STOP MOS34 0634 DB4F v4F MOS34 0671 DB73 B0 FE BCS STOP ;hang if not within auto-boot program MOS34 0634 DB4F v4F MOS34 0672 DB75 20 E7 FF JSR OSNEWL MOS34 0634 DB4F v4F MOS34 0673 DB78 20 E7 FF JSR OSNEWL ;place 2*CR/LF after error message MOS34 0634 DB4F v4F MOS34 0674 DB7B ;fall through MOS34 0634 DB4F v4F MOS34 0675 DB7B ] MOS34 0634 DB4F v4F MOS34 0676 DB7B MOS34 0634 DB4F v4F MOS34 0677 DB7B NOAUTO MOS34 0634 DB4F v4F MOS34 0678 DB7B EBRK ;unexpected (early) BRK (e.g. 'File not found') MOS34 0634 DB4F v4F MOS34 0679 DB7B ; MOS34 0634 DB4F v4F MOS34 0680 DB7B ; initialise cassette filing system (CFS) MOS34 0634 DB4F v4F MOS34 0681 DB7B ; MOS34 0634 DB4F v4F MOS34 0682 DB7B A9 00 LDAIM ZERO ;select CFS MOS34 0634 DB4F v4F MOS34 0683 DB7D AA TAX ;X:=0, select default baudrate (1200 baud) MOS34 0634 DB4F v4F MOS34 0684 DB7E 20 43 F1 JSR TAPE12 ;initialise CFS MOS34 0634 DB4F v4F MOS34 0685 DB81 ; MOS34 0634 DB4F v4F MOS34 0686 DB81 DNRFS ;do not reset filing system MOS34 0634 DB4F v4F MOS34 0687 DB81 ; MOS34 0634 DB4F v4F MOS34 0688 DB81 SLANG ;select a language ROM to enter MOS34 0634 DB4F v4F MOS34 0689 DB81 AD 8D 02 LDA TYPE -- MOS34 0690 DB84 D0 05 BNE SLANG1 ;[hard restart - use same language as last time] MOS34 0690 DB84 v7A MOS34 0691 DB86 ; MOS34 0690 DB84 v7A MOS34 0692 DB86 ; soft restart - ensure language exists MOS34 0690 DB84 v7A MOS34 0693 DB86 ; A b0=0 used by ILR2 enter ROM with C=0 MOS34 0690 DB84 v7A MOS34 0694 DB86 ; MOS34 0690 DB84 v7A MOS34 0695 DB86 AE 8C 02 LDX LROMID MOS34 0690 DB84 v7A MOS34 0696 DB89 10 1E BPL ILR2 ;[language does exist] MOS34 0696 DB89 v61 MOS34 0697 DB8B ; MOS34 0696 DB89 v61 MOS34 0698 DB8B SLANG1 ;find first language ROM MOS34 0696 DB89 v61 MOS34 0699 DB8B ; MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 62 MOS34 Entry point after hardware break/reset MOS34 MOS34 0696 DB89 v61 MOS34 0700 DB8B A2 0F LDXIM NROM-&1 MOS34 0696 DB89 v61 MOS34 0701 DB8D ILR1 MOS34 0696 DB89 v61 MOS34 0702 DB8D BD A1 02 LDAAX ROMS MOS34 0696 DB89 v61 MOS34 0703 DB90 [ MOS125 = &FF MOS34 0696 DB89 v61 MOS34 0705 DB90 | MOS34 0696 DB89 v61 MOS34 0706 DB90 0A ASLA ;b0=0 used by ILR2 enter ROM with C=0 MOS34 0696 DB89 v61 MOS34 0707 DB91 ] MOS34 0696 DB89 v61 MOS34 0708 DB91 30 16 BMI ILR2 ;[found language ROM] MOS34 0696 DB89 v61 MOS34 0709 DB93 ; MOS34 0696 DB89 v61 MOS34 0710 DB93 CA DEX MOS34 0696 DB89 v61 MOS34 0711 DB94 10 F7 BPL ILR1 ;[continue search for language ROM] MOS34 0696 DB89 v61 MOS34 0712 DB96 ; MOS34 0696 DB89 v61 MOS34 0713 DB96 A9 00 LDAIM LGNONE MOS34 0696 DB89 v61 MOS34 0714 DB98 2C 7A 02 BIT TUBEM MOS34 0696 DB89 v61 MOS34 0715 DB9B 30 30 BMI TLANG ;[tube active] MOS34 0715 DB9B v4F MOS34 0716 DB9D ; neither language nor tube present MOS34 0715 DB9B v4F MOS34 0717 DB9D 00 BRK MOS34 0715 DB9B v4F MOS34 0718 DB9E F9 = NOLROM MOS34 0715 DB9B v4F MOS34 0719 DB9F 4C 61 6E = "Language?" MOS34 0715 DB9B v4F MOS34 0720 DBA8 00 = ZERO MOS34 0715 DB9B v4F MOS34 0721 DBA9 ; MOS34 0715 DB9B v4F MOS34 0722 DBA9 [ MOS125 = &FF MOS34 0715 DB9B v4F MOS34 0725 DBA9 | MOS34 0715 DB9B v4F MOS34 0726 DBA9 ILR2 ;*BASIC enters with A b0=1 indicate manual entry MOS34 0715 DB9B v4F MOS34 0727 DBA9 4A LSRA ;C=0 indicate to tube that this is a restart MOS34 0715 DB9B v4F MOS34 0728 DBAA ] MOS34 0715 DB9B v4F MOS34 0729 DBAA SELANG ;FX entry point, entered with C=1 (for tube) MOS34 0715 DB9B v4F MOS34 0730 DBAA ; found language ROM MOS34 0715 DB9B v4F MOS34 0731 DBAA ; select language ROM MOS34 0715 DB9B v4F MOS34 0732 DBAA 08 PHP ;save entry type (present in C) MOS34 0715 DB9B v4F MOS34 0733 DBAB [ MOS125 = &FF MOS34 0715 DB9B v4F MOS34 0735 DBAB ] MOS34 0715 DB9B v4F MOS34 0736 DBAB 20 DB DB JSR STXROM MOS34 0715 DB9B v4F MOS34 0737 DBAE ; output ROM message MOS34 0715 DB9B v4F MOS34 0738 DBAE A9 80 LDAIM /(LANG ) MOS34 0715 DB9B v4F MOS34 0739 DBB0 A0 08 LDYIM ROMMSG-&1 MOS34 0715 DB9B v4F MOS34 0740 DBB2 20 57 DE JSR WRSTRA MOS34 0715 DB9B v4F MOS34 0741 DBB5 ; N.B. Y offset left pointing to copyright message MOS34 0715 DB9B v4F MOS34 0742 DBB5 84 FD STY REPTR +&00 MOS34 0715 DB9B v4F MOS34 0743 DBB7 20 E7 FF JSR OSNEWL MOS34 0715 DB9B v4F MOS34 0744 DBBA 20 E7 FF JSR OSNEWL MOS34 0715 DB9B v4F MOS34 0745 DBBD ; MOS34 0715 DB9B v4F MOS34 0746 DBBD ; enter language MOS34 0715 DB9B v4F MOS34 0747 DBBD ; MOS34 0715 DB9B v4F MOS34 0748 DBBD 28 PLP ;restore entry type into C MOS34 0715 DB9B v4F MOS34 0749 DBBE [ MOS125 = &FF MOS34 0715 DB9B v4F MOS34 0750 DBBE | MOS34 0715 DB9B v4F MOS34 0751 DBBE ;preserve BRK handler until all printing done MOS34 0715 DB9B v4F MOS34 0752 DBBE A5 F4 LDA ROMID MOS34 0715 DB9B v4F MOS34 0753 DBC0 8D 8C 02 STA LROMID MOS34 0715 DB9B v4F MOS34 0754 DBC3 ] MOS34 0715 DB9B v4F MOS34 0755 DBC3 A9 01 LDAIM LGENTR ;entry reason MOS34 0715 DB9B v4F MOS34 0756 DBC5 2C 7A 02 BIT TUBEM MOS34 0715 DB9B v4F MOS34 0757 DBC8 30 03 BMI TLANG ;[tube active] MOS34 0715 DB9B v4F MOS34 0758 DBCA 4C 00 80 JMP ROMHRD ;ROM entry MOS34 0715 DB9B v4F MOS34 0759 DBCD TLANG MOS34 0715 DB9B v4F MOS34 0760 DBCD 4C 00 04 JMP TBLANG ;tube entry -- MOS34 0761 DBD0 -- MOS34 0762 DBD0 -- MOS34 0763 DBD0 LNK MOS36 -- MOS36 0001 DBD0 ; > MOS36 -- MOS36 0002 DBD0 TTL MOS36 Int servicing -- MOS36 0003 DBD0 OPT MOS36 MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 63 MOS36 MOS36 Int servicing MOS36 -- MOS36 0004 DBD0 -- MOS36 0005 DBD0 ;(c) 1981 ACORN Computers Limited -- MOS36 0006 DBD0 ;BBC MOS -- MOS36 0007 DBD0 ;Change record: -- MOS36 0008 DBD0 -- MOS36 0009 DBD0 ;Author(s): -- MOS36 0010 DBD0 ;PB Paul Bond -- MOS36 0011 DBD0 -- MOS36 0012 DBD0 ; interrupt service mainline -- MOS36 0013 DBD0 ; priority sequence:- -- MOS36 0014 DBD0 ; [6850] -- MOS36 0015 DBD0 ; 1. RS423 -- MOS36 0016 DBD0 ; [6522a] -- MOS36 0017 DBD0 ; 2. VSYNC -- MOS36 0018 DBD0 ; 3. centisecond timer -- MOS36 0019 DBD0 ; 4. ADC -- MOS36 0020 DBD0 ; 5. keyboard -- MOS36 0021 DBD0 ; [6522b] -- MOS36 0022 DBD0 ; 6. printer (parallel interface) -- MOS36 0023 DBD0 -- MOS36 0024 DBD0 -- MOS36 0025 DBD0 RPROM ;read byte from paged ROM -- MOS36 0026 DBD0 ; read byte at ROMPTR in ROM Y into A -- MOS36 0027 DBD0 A6 F4 LDX ROMID -- MOS36 0028 DBD2 84 F4 STY ROMID -- MOS36 0029 DBD4 8C 30 FE STY ROM -- MOS36 0030 DBD7 A0 00 LDYIM ZERO -- MOS36 0031 DBD9 B1 F6 LDAIY ROMPTR -- MOS36 0032 DBDB STXROM -- MOS36 0033 DBDB 86 F4 STX ROMID -- MOS36 0034 DBDD 8E 30 FE STX ROM -- MOS36 0035 DBE0 60 RTS -- MOS36 0036 DBE1 -- MOS36 0037 DBE1 -- MOS36 0038 DBE1 -- MOS36 0039 DBE1 IRQ ;entered at IRQ or BRK -- MOS36 0040 DBE1 85 FC STA TEMPA -- MOS36 0041 DBE3 68 PLA -- MOS36 0042 DBE4 48 PHA ;A := processor status -- MOS36 0043 DBE5 29 10 ANDIM &10 -- MOS36 0044 DBE7 D0 03 BNE BRK MOS36 0044 DBE7 v7C MOS36 0045 DBE9 6C 04 02 JMI IRQALL ;indirect thru 'all IRQs' routine MOS36 0044 DBE7 v7C MOS36 0046 DBEC ; (defaults to DEFIRQ) MOS36 0044 DBE7 v7C MOS36 0047 DBEC ; MOS36 0044 DBE7 v7C MOS36 0048 DBEC BRK MOS36 0044 DBE7 v7C MOS36 0049 DBEC 8A TXA -- MOS36 0050 DBED 48 PHA ;save X -- MOS36 0051 DBEE BA TSX -- MOS36 0052 DBEF BD 03 01 LDAAX &0100+&03 ;get address low -- MOS36 0053 DBF2 D8 CLD -- MOS36 0054 DBF3 38 SEC -- MOS36 0055 DBF4 E9 01 SBCIM &01 -- MOS36 0056 DBF6 85 FD STA REPTR +&00 -- MOS36 0057 DBF8 BD 04 01 LDAAX &0100+&04 ;get address high -- MOS36 0058 DBFB E9 00 SBCIM ZERO -- MOS36 0059 DBFD 85 FE STA REPTR +&01 -- MOS36 0060 DBFF ; record ROM source of BRK -- MOS36 0061 DBFF A5 F4 LDA ROMID -- MOS36 0062 DC01 8D 4A 02 STA REPROM -- MOS36 0063 DC04 ; offer BRK to service ROMs -- MOS36 0064 DC04 86 F0 STX BYTEX ;provide clean way for service ROM to access relevant stack area -- MOS36 0065 DC06 A2 06 LDXIM SVBRK -- MOS36 0066 DC08 20 74 F1 JSR SVOP -- MOS36 0067 DC0B ; force language ROM (may be BASIC in pre-interface days) -- MOS36 0068 DC0B AE 8C 02 LDX LROMID -- MOS36 0069 DC0E 20 DB DB JSR STXROM ;reset to language ROM -- MOS36 0070 DC11 ; -- MOS36 0071 DC11 ; restore X -- MOS36 0072 DC11 ; -- MOS36 0073 DC11 68 PLA -- MOS36 0074 DC12 AA TAX -- MOS36 0075 DC13 ; -- MOS36 0076 DC13 ; restore A -- MOS36 0077 DC13 ; -- MOS36 0078 DC13 A5 FC LDA TEMPA -- MOS36 0079 DC15 ; -- MOS36 0080 DC15 ; enable interrupts and let user process BRK -- MOS36 0081 DC15 ; -- MOS36 0082 DC15 58 CLI -- MOS36 0083 DC16 6C 02 02 JMI BRKVEC ;process BRK, N.B. default is DEFBRK -- MOS36 0084 DC19 ; -- MOS36 0085 DC19 [ MOS125 = &FF -- MOS36 0098 DC19 ] -- MOS36 0099 DC19 -- MOS36 0100 DC19 -- MOS36 0101 DC19 TTL IRQ processing -- MOS36 0102 DC19 OPT OPNEWP MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 64 MOS36 IRQ processing MOS36 -- MOS36 0103 DC19 -- MOS36 0104 DC19 -- MOS36 0105 DC19 TXDINT ;disable Tx interrupt -- MOS36 0106 DC19 ; -- MOS36 0107 DC19 ; RS423 printer selected but printer buffer empty -- MOS36 0108 DC19 ; -- MOS36 0109 DC19 38 SEC MOS36 0267 DC77 ^20 MOS36 0110 DC1A 6E 4F 02 ROR RSFLAG ;flag RS423 available MOS36 0267 DC77 ^20 MOS36 0111 DC1D ; MOS36 0267 DC77 ^20 MOS36 0112 DC1D ; no more characters to print MOS36 0267 DC77 ^20 MOS36 0113 DC1D ; MOS36 0267 DC77 ^20 MOS36 0114 DC1D ; disable RS423 Tx MOS36 0267 DC77 ^20 MOS36 0115 DC1D ; find whether to set RTS hi or lo MOS36 0267 DC77 ^20 MOS36 0116 DC1D ; MOS36 0267 DC77 ^20 MOS36 0117 DC1D ; check whether RS423 Rx enabled MOS36 0267 DC77 ^20 MOS36 0118 DC1D ; MOS36 0267 DC77 ^20 MOS36 0119 DC1D 2C 50 02 BIT RSCTFL MOS36 0267 DC77 ^20 MOS36 0120 DC20 10 07 BPL RLO ;[Rx disabled] MOS36 0267 DC77 ^20 MOS36 0121 DC22 ; MOS36 0267 DC77 ^20 MOS36 0122 DC22 ; Rx enabled MOS36 0267 DC77 ^20 MOS36 0123 DC22 ; MOS36 0267 DC77 ^20 MOS36 0124 DC22 ; check bytes in RS423 input buffer MOS36 0267 DC77 ^20 MOS36 0125 DC22 ; MOS36 0267 DC77 ^20 MOS36 0126 DC22 20 83 E7 JSR CNTRS MOS36 0267 DC77 ^20 MOS36 0127 DC25 ; MOS36 0267 DC77 ^20 MOS36 0128 DC25 ; C=0 => overflow, C=1 => no overflow MOS36 0267 DC77 ^20 MOS36 0129 DC25 ; check whether within overflow region MOS36 0267 DC77 ^20 MOS36 0130 DC25 ; MOS36 0267 DC77 ^20 MOS36 0131 DC25 A2 00 LDXIM RHITXD MOS36 0267 DC77 ^20 MOS36 0132 DC27 B0 02 BCS RSOK ;[not overflowing] MOS36 0267 DC77 ^20 MOS36 0133 DC29 ; MOS36 0267 DC77 ^20 MOS36 0134 DC29 ; within overflow region MOS36 0267 DC77 ^20 MOS36 0135 DC29 ; MOS36 0267 DC77 ^20 MOS36 0136 DC29 RLO ;set RTS lo, Tx interrupt disabled (unfortunately) MOS36 0267 DC77 ^20 MOS36 0137 DC29 A2 40 LDXIM RLOTXD MOS36 0267 DC77 ^20 MOS36 0138 DC2B ; MOS36 0267 DC77 ^20 MOS36 0139 DC2B RSOK ;set RTS hi/lo, Tx interrupt disabled MOS36 0267 DC77 ^20 MOS36 0140 DC2B 4C CA E1 JMP RSED ;disable Tx interrupts AND return from interrupt MOS36 0267 DC77 ^20 MOS36 0141 DC2E MOS36 0267 DC77 ^20 MOS36 0142 DC2E MOS36 0267 DC77 ^20 MOS36 0143 DC2E RX68 ;RS423 Rx interrupt MOS36 0267 DC77 ^20 MOS36 0144 DC2E ; MOS36 0267 DC77 ^20 MOS36 0145 DC2E ; A = 0|0|PE|OVRN|FE|CTS|DCD|TDRE MOS36 0267 DC77 ^20 MOS36 0146 DC2E ; MOS36 0267 DC77 ^20 MOS36 0147 DC2E AC 09 FE LDY RSDATA ;read data byte to clear interrupt MOS36 0267 DC77 ^20 MOS36 0148 DC31 29 3A ANDIM &3A ;CTS & TDRE are not relevant to Rx MOS36 0267 DC77 ^20 MOS36 0149 DC33 D0 26 BNE RX68BD ;[bad Rx, PE|OVRN|FE|DCD] MOS36 0267 DC77 ^20 MOS36 0150 DC35 ; MOS36 0267 DC77 ^20 MOS36 0151 DC35 ; good reception - move byte into RS423 input buffer MOS36 0267 DC77 ^20 MOS36 0152 DC35 ; MOS36 0267 DC77 ^20 MOS36 0153 DC35 AE 5C 02 LDX RSSHUT MOS36 0267 DC77 ^20 MOS36 0154 DC38 D0 09 BNE NRSI ;[suppress RS423 input] MOS36 0267 DC77 ^20 MOS36 0155 DC3A ; MOS36 0267 DC77 ^20 MOS36 0156 DC3A ; X=0 MOS36 0267 DC77 ^20 MOS36 0157 DC3A ; MOS36 0267 DC77 ^20 MOS36 0158 DC3A E8 INX ;X = BRSI = $01 MOS36 0267 DC77 ^20 MOS36 0159 DC3B 20 36 E5 JSR RNSRT ;insert character into RS423 buffer MOS36 0267 DC77 ^20 MOS36 0160 DC3E ; MOS36 0267 DC77 ^20 MOS36 0161 DC3E ; check number of characters in buffer MOS36 0267 DC77 ^20 MOS36 0162 DC3E ; MOS36 0267 DC77 ^20 MOS36 0163 DC3E 20 83 E7 JSR CNTRS MOS36 0267 DC77 ^20 MOS36 0164 DC41 ; MOS36 0267 DC77 ^20 MOS36 0165 DC41 ; check whether running into overflow area MOS36 0267 DC77 ^20 MOS36 0166 DC41 ; MOS36 0267 DC77 ^20 MOS36 0167 DC41 90 E6 BCC RLO ;[running into overflow area, set RTS lo, Tx interrupt disabled] MOS36 0267 DC77 ^20 MOS36 0168 DC43 NRSI ;suppress RS423 input MOS36 0267 DC77 ^20 MOS36 0169 DC43 60 RTS MOS36 0267 DC77 ^20 MOS36 0170 DC44 MOS36 0267 DC77 ^20 MOS36 0171 DC44 MOS36 0267 DC77 ^20 MOS36 0172 DC44 [ MOS125 = &FF MOS36 0267 DC77 ^20 MOS36 0188 DC44 | MOS36 0267 DC77 ^20 MOS36 0189 DC44 VAT MOS36 0267 DC77 ^20 MOS36 0190 DC44 ] MOS36 0267 DC77 ^20 MOS36 0191 DC44 ; MOS36 0267 DC77 ^20 MOS36 0192 DC44 ; indicate in DEFIRQ MOS36 0267 DC77 ^20 MOS36 0193 DC44 ; MOS36 0267 DC77 ^20 MOS36 0194 DC44 B8 CLV MOS36 0267 DC77 ^20 MOS36 0195 DC45 ; MOS36 0267 DC77 ^20 MOS36 0196 DC45 IRQ68 ;check for interrupt from 6850 MOS36 0267 DC77 ^20 MOS36 0197 DC45 ; MOS36 0267 DC77 ^20 MOS36 0198 DC45 [ $Tutu MOS36 0267 DC77 ^20 MOS36 0201 DC45 | MOS36 0267 DC77 ^20 MOS36 0202 DC45 AD 08 FE LDA RSTAT MOS36 0267 DC77 ^20 MOS36 0203 DC48 ] MOS36 0267 DC77 ^20 MOS36 0204 DC48 70 02 BVS RSTIME ;[timer interrupt] MOS36 0267 DC77 ^20 MOS36 0205 DC4A ; MOS36 0267 DC77 ^20 MOS36 0206 DC4A 10 5D BPL IRQA ;[not a 6850 interrupt, N.B. possibly timer interrupt entry] MOS36 0267 DC77 ^20 MOS36 0207 DC4C ; MOS36 0267 DC77 ^20 MOS36 0208 DC4C RSTIME ;timer interrupt MOS36 0267 DC77 ^20 MOS36 0209 DC4C ; MOS36 0267 DC77 ^20 MOS36 0210 DC4C ; 6850 interrupt MOS36 0267 DC77 ^20 MOS36 0211 DC4C ; MOS36 0267 DC77 ^20 MOS36 0212 DC4C ; use RSTUT to decide where to route the interrupt MOS36 0267 DC77 ^20 MOS36 0213 DC4C ; MOS36 0267 DC77 ^20 MOS36 0214 DC4C A6 EA LDX RSTUT MOS36 0267 DC77 ^20 MOS36 0215 DC4E CA DEX MOS36 0267 DC77 ^20 MOS36 0216 DC4F 30 30 BMI NOTCFS ;[RS423 not managed by CFS] MOS36 0267 DC77 ^20 MOS36 0217 DC51 ; MOS36 0267 DC77 ^20 MOS36 0218 DC51 ; inform CFS of the interrupt MOS36 0267 DC77 ^20 MOS36 0219 DC51 ; MOS36 0267 DC77 ^20 MOS36 0220 DC51 70 2D BVS RTS68 ;[ignore timer interrupt entry] MOS36 0267 DC77 ^20 MOS36 0221 DC53 4C B6 F5 JMP IRUPT ;let CFS handle interrupt AND return from interrupt MOS36 0267 DC77 ^20 MOS36 0222 DC56 MOS36 0267 DC77 ^20 MOS36 0223 DC56 MOS36 0267 DC77 ^20 MOS36 0224 DC56 MDCD ;neither Rx not Tx interrupt => DCD interrupt MOS36 0267 DC77 ^20 MOS36 0225 DC56 ; MOS36 0267 DC77 ^20 MOS36 0226 DC56 AC 09 FE LDY RSDATA ;clear DCD interrupt MOS36 0267 DC77 ^20 MOS36 0227 DC59 2A ROLA ;DCD -> lo-bit MOS36 0267 DC77 ^20 MOS36 0228 DC5A 0A ASLA ;restore status byte MOS36 0267 DC77 ^20 MOS36 0229 DC5B ; MOS36 0267 DC77 ^20 MOS36 0230 DC5B RX68BD ;bad RS423 Rx MOS36 0267 DC77 ^20 MOS36 0231 DC5B ; MOS36 0267 DC77 ^20 MOS36 0232 DC5B ; A = 0|0|PE|OVRN|FE|0|DCD|0 MOS36 0267 DC77 ^20 MOS36 0233 DC5B ; C=1 MOS36 0267 DC77 ^20 MOS36 0234 DC5B ; MOS36 0267 DC77 ^20 MOS36 0235 DC5B ; signal RS423 error MOS36 0267 DC77 ^20 MOS36 0236 DC5B ; MOS36 0267 DC77 ^20 MOS36 0237 DC5B AA TAX ;X := status MOS36 0267 DC77 ^20 MOS36 0238 DC5C 98 TYA ;A := character MOS36 0267 DC77 ^20 MOS36 0239 DC5D A0 07 LDYIM EVRS ;RS423 error event MOS36 0267 DC77 ^20 MOS36 0240 DC5F 4C D8 E4 JMP EVENT ;signal event AND return from interrupt MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 65 MOS36 IRQ processing MOS36 MOS36 0267 DC77 ^20 MOS36 0241 DC62 MOS36 0267 DC77 ^20 MOS36 0242 DC62 MOS36 0267 DC77 ^20 MOS36 0243 DC62 TDRE ;Tx interrupt MOS36 0267 DC77 ^20 MOS36 0244 DC62 ; MOS36 0267 DC77 ^20 MOS36 0245 DC62 ; RS423 is not claimed by CFS, so we are either MOS36 0267 DC77 ^20 MOS36 0246 DC62 ; writing or printing to RS423 MOS36 0267 DC77 ^20 MOS36 0247 DC62 ; MOS36 0267 DC77 ^20 MOS36 0248 DC62 ; extract character from RS423 Tx buffer MOS36 0267 DC77 ^20 MOS36 0249 DC62 ; MOS36 0267 DC77 ^20 MOS36 0250 DC62 A2 02 LDXIM BRSO MOS36 0267 DC77 ^20 MOS36 0251 DC64 20 A4 E4 JSR REMOV MOS36 0267 DC77 ^20 MOS36 0252 DC67 90 10 BCC TXCH ;[character to transmit] MOS36 0267 DC77 ^20 MOS36 0253 DC69 ; X=BRSO MOS36 0267 DC77 ^20 MOS36 0254 DC69 ; MOS36 0267 DC77 ^20 MOS36 0255 DC69 ; check for print to RS423 MOS36 0267 DC77 ^20 MOS36 0256 DC69 ; MOS36 0267 DC77 ^20 MOS36 0257 DC69 AD 85 02 LDA PRNTSW MOS36 0267 DC77 ^20 MOS36 0258 DC6C C9 02 CMPIM PRS MOS36 0267 DC77 ^20 MOS36 0259 DC6E D0 A9 BNE TXDINT ;[RS423 printer not selected] MOS36 0267 DC77 ^20 MOS36 0260 DC70 ; X=BRSO MOS36 0267 DC77 ^20 MOS36 0261 DC70 ; MOS36 0267 DC77 ^20 MOS36 0262 DC70 ; remove possible character from print buffer MOS36 0267 DC77 ^20 MOS36 0263 DC70 ; MOS36 0267 DC77 ^20 MOS36 0264 DC70 E8 INX ;X = BRSO+1 = BPRNT MOS36 0267 DC77 ^20 MOS36 0265 DC71 20 A4 E4 JSR REMOV ;remove character from printer buffer MOS36 0267 DC77 ^20 MOS36 0266 DC74 6E D2 02 ROR PFLAG ;update printer flag MOS36 0267 DC77 ^20 MOS36 0267 DC77 30 A0 BMI TXDINT ;[no character to print] MOS36 0292 DC8C ^20 MOS36 0268 DC79 ; MOS36 0292 DC8C ^20 MOS36 0269 DC79 TXCH ;transmit character in A MOS36 0292 DC8C ^20 MOS36 0270 DC79 ; MOS36 0292 DC8C ^20 MOS36 0271 DC79 8D 09 FE STA RSDATA ;transmit character MOS36 0292 DC8C ^20 MOS36 0272 DC7C ; MOS36 0292 DC8C ^20 MOS36 0273 DC7C ; set RS423 printer timeout active MOS36 0292 DC8C ^20 MOS36 0274 DC7C ; MOS36 0292 DC8C ^20 MOS36 0275 DC7C A9 E7 LDAIM PTIMUT MOS36 0292 DC8C ^20 MOS36 0276 DC7E 85 EA STA RSTUT MOS36 0292 DC8C ^20 MOS36 0277 DC80 ; MOS36 0292 DC8C ^20 MOS36 0278 DC80 MOS36 0292 DC8C ^20 MOS36 0279 DC80 RTS68 MOS36 0292 DC8C ^20 MOS36 0280 DC80 UNK0 MOS36 0292 DC8C ^20 MOS36 0281 DC80 60 RTS ;return from interrupt MOS36 0292 DC8C ^20 MOS36 0282 DC81 MOS36 0292 DC8C ^20 MOS36 0283 DC81 MOS36 0292 DC8C ^20 MOS36 0284 DC81 NOTCFS ;RS423 not managed by CFS MOS36 0292 DC8C ^20 MOS36 0285 DC81 ; MOS36 0292 DC8C ^20 MOS36 0286 DC81 2D 78 02 AND C6850 ;suppress bits according to user tastes MOS36 0292 DC8C ^20 MOS36 0287 DC84 4A LSRA ;C=Rx MOS36 0292 DC8C ^20 MOS36 0288 DC85 90 07 BCC NOTRX ;[not Rx int] MOS36 0292 DC8C ^20 MOS36 0289 DC87 70 05 BVS NOTRX ;[do not allow Rx by polling] MOS36 0292 DC8C ^20 MOS36 0290 DC89 ; MOS36 0292 DC8C ^20 MOS36 0291 DC89 AC 50 02 LDY RSCTFL MOS36 0292 DC8C ^20 MOS36 0292 DC8C 30 A0 BMI RX68 ;[recieve interrupts enabled] MOS36 0206 DC4A v22 MOS36 0293 DC8E ; MOS36 0206 DC4A v22 MOS36 0294 DC8E NOTRX MOS36 0206 DC4A v22 MOS36 0295 DC8E 4A LSRA ;C=Tx, N=Rx MOS36 0206 DC4A v22 MOS36 0296 DC8F 6A RORA ;C=DCD, N=Tx MOS36 0206 DC4A v22 MOS36 0297 DC90 B0 C4 BCS MDCD ;[DCD interrupt] MOS36 0206 DC4A v22 MOS36 0298 DC92 ; MOS36 0206 DC4A v22 MOS36 0299 DC92 30 CE BMI TDRE ;[TDRE] MOS36 0206 DC4A v22 MOS36 0300 DC94 ; MOS36 0206 DC4A v22 MOS36 0301 DC94 70 EA BVS RTS68 ;[timer interrupt entry] MOS36 0206 DC4A v22 MOS36 0302 DC96 ; MOS36 0206 DC4A v22 MOS36 0303 DC96 ; not timer interrupt entry MOS36 0206 DC4A v22 MOS36 0304 DC96 ; MOS36 0206 DC4A v22 MOS36 0305 DC96 UNKIRQ ;unknown interrupt MOS36 0206 DC4A v22 MOS36 0306 DC96 ; MOS36 0206 DC4A v22 MOS36 0307 DC96 A2 05 LDXIM SVINT MOS36 0415 DCFB ^19 MOS36 0308 DC98 20 74 F1 JSR SVOP ;allow FS ROMs to process interrupt MOS36 0415 DCFB ^19 MOS36 0309 DC9B F0 E3 BEQ UNK0 ;[service ROM dealt with interrupt] MOS36 0415 DCFB ^19 MOS36 0310 DC9D ; MOS36 0415 DCFB ^19 MOS36 0311 DC9D ; pull return address MOS36 0415 DCFB ^19 MOS36 0312 DC9D ; MOS36 0415 DCFB ^19 MOS36 0313 DC9D 68 PLA MOS36 0415 DCFB ^19 MOS36 0314 DC9E 68 PLA MOS36 0415 DCFB ^19 MOS36 0315 DC9F ; MOS36 0415 DCFB ^19 MOS36 0316 DC9F ; restore X and Y for user interrupt routine MOS36 0415 DCFB ^19 MOS36 0317 DC9F ; MOS36 0415 DCFB ^19 MOS36 0318 DC9F 68 PLA MOS36 0415 DCFB ^19 MOS36 0319 DCA0 A8 TAY MOS36 0415 DCFB ^19 MOS36 0320 DCA1 68 PLA MOS36 0415 DCFB ^19 MOS36 0321 DCA2 AA TAX MOS36 0415 DCFB ^19 MOS36 0322 DCA3 68 PLA MOS36 0415 DCFB ^19 MOS36 0323 DCA4 85 FC STA TEMPA MOS36 0415 DCFB ^19 MOS36 0324 DCA6 6C 06 02 JMI IRQVEC ;assume that user will clear the interrupt MOS36 0415 DCFB ^19 MOS36 0325 DCA9 ; (defaults to IRQTWO) MOS36 0415 DCFB ^19 MOS36 0326 DCA9 MOS36 0415 DCFB ^19 MOS36 0327 DCA9 MOS36 0415 DCFB ^19 MOS36 0328 DCA9 MOS36 0415 DCFB ^19 MOS36 0329 DCA9 IRQA ;check for interrupt from primary 6522 MOS36 0415 DCFB ^19 MOS36 0330 DCA9 ; MOS36 0415 DCFB ^19 MOS36 0331 DCA9 AD 4D FE LDA IFRQ ;A = IFR [IRQ,TIMER1,TIMER2,CB1,CB2,SHIFTREG,CA1,CA2] MOS36 0415 DCFB ^19 MOS36 0332 DCAC 10 3A BPL IRQB ;[not a VIAA interrupt] MOS36 0415 DCFB ^19 MOS36 0333 DCAE ; MOS36 0415 DCFB ^19 MOS36 0334 DCAE ; MOS36 0415 DCFB ^19 MOS36 0335 DCAE 2D 79 02 AND A6522 ;suppress bits according to user tastes MOS36 0415 DCFB ^19 MOS36 0336 DCB1 2D 4E FE AND IERQ ;N.B. only look at enabled interrupts MOS36 0415 DCFB ^19 MOS36 0337 DCB4 ; MOS36 0415 DCFB ^19 MOS36 0338 DCB4 ; MOS36 0415 DCFB ^19 MOS36 0339 DCB4 6A RORA ;A = IFR >> 1 MOS36 0415 DCFB ^19 MOS36 0340 DCB5 6A RORA ;A = IFR >> 2, C = CA1, N = CA2 MOS36 0415 DCFB ^19 MOS36 0341 DCB6 90 52 BCC ITIME2 ;[not VSYNC interrupt] MOS36 0415 DCFB ^19 MOS36 0342 DCB8 ; MOS36 0415 DCFB ^19 MOS36 0343 DCB8 ; VSYNC interrupt MOS36 0415 DCFB ^19 MOS36 0344 DCB8 ; N.B. C=1 MOS36 0415 DCFB ^19 MOS36 0345 DCB8 ; MOS36 0415 DCFB ^19 MOS36 0346 DCB8 CE 40 02 DEC CYCLE ;update CFS timeout byte MOS36 0415 DCFB ^19 MOS36 0347 DCBB A5 EA LDA RSTUT ;decrement RS423 printer timeout MOS36 0415 DCFB ^19 MOS36 0348 DCBD 10 02 BPL NPRST MOS36 0415 DCFB ^19 MOS36 0349 DCBF E6 EA INC RSTUT MOS36 0415 DCFB ^19 MOS36 0350 DCC1 ; MOS36 0415 DCFB ^19 MOS36 0351 DCC1 NPRST ;no RS423 printer timeout MOS36 0415 DCFB ^19 MOS36 0352 DCC1 ; MOS36 0415 DCFB ^19 MOS36 0353 DCC1 AD 51 02 LDA FLCNT MOS36 0415 DCFB ^19 MOS36 0354 DCC4 F0 18 BEQ IVS1 ;[flash disabled] MOS36 0415 DCFB ^19 MOS36 0355 DCC6 CE 51 02 DEC FLCNT MOS36 0415 DCFB ^19 MOS36 0356 DCC9 D0 13 BNE IVS1 ;[flash count not exhausted] MOS36 0415 DCFB ^19 MOS36 0357 DCCB ; MOS36 0415 DCFB ^19 MOS36 0358 DCCB ; flash count exhausted MOS36 0415 DCFB ^19 MOS36 0359 DCCB ; reset FLCNT MOS36 0415 DCFB ^19 MOS36 0360 DCCB ; MOS36 0415 DCFB ^19 MOS36 0361 DCCB [ MOS125 = &FF MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 66 MOS36 IRQ processing MOS36 MOS36 0415 DCFB ^19 MOS36 0372 DCCB | MOS36 0415 DCFB ^19 MOS36 0373 DCCB ; A=1 MOS36 0415 DCFB ^19 MOS36 0374 DCCB AE 52 02 LDX FLSPC MOS36 0415 DCFB ^19 MOS36 0375 DCCE 4D 48 02 EOR VPREGA ;invert flash bit MOS36 0415 DCFB ^19 MOS36 0376 DCD1 4A LSRA ;C = new flash bit MOS36 0415 DCFB ^19 MOS36 0377 DCD2 B0 03 BCS FLASH1 ;[old flash bit = 0] MOS36 0415 DCFB ^19 MOS36 0378 DCD4 ; old flash bit = 1 MOS36 0415 DCFB ^19 MOS36 0379 DCD4 AE 53 02 LDX FLMRK MOS36 0415 DCFB ^19 MOS36 0380 DCD7 FLASH1 MOS36 0415 DCFB ^19 MOS36 0381 DCD7 ; MOS36 0415 DCFB ^19 MOS36 0382 DCD7 2A ROLA ;A = VPREGA MOS36 0415 DCFB ^19 MOS36 0383 DCD8 ] MOS36 0415 DCFB ^19 MOS36 0384 DCD8 20 05 EA JSR MVPRC0 ;update video processor and register image MOS36 0415 DCFB ^19 MOS36 0385 DCDB 8E 51 02 STX FLCNT ;update flash count MOS36 0415 DCFB ^19 MOS36 0386 DCDE ; MOS36 0415 DCFB ^19 MOS36 0387 DCDE IVS1 MOS36 0415 DCFB ^19 MOS36 0388 DCDE A0 04 LDYIM EVVSYN MOS36 0415 DCFB ^19 MOS36 0389 DCE0 20 D8 E4 JSR EVENT MOS36 0415 DCFB ^19 MOS36 0390 DCE3 ; MOS36 0415 DCFB ^19 MOS36 0391 DCE3 A9 02 LDAIM VSYNC MOS36 0415 DCFB ^19 MOS36 0392 DCE5 4C 0F DE JMP IVIAA0 ;clear interrupt and return MOS36 0415 DCFB ^19 MOS36 0393 DCE8 MOS36 0415 DCFB ^19 MOS36 0394 DCE8 MOS36 0415 DCFB ^19 MOS36 0395 DCE8 MOS36 0415 DCFB ^19 MOS36 0396 DCE8 IRQB ;check for interrupt from secondary 6522 MOS36 0415 DCFB ^19 MOS36 0397 DCE8 ; MOS36 0415 DCFB ^19 MOS36 0398 DCE8 AD 6D FE LDA IFRR ;A = IFR, C = ?, N = IRQ MOS36 0415 DCFB ^19 MOS36 0399 DCEB 10 A9 BPL UNKIRQ ;[not a VIAB interrupt] MOS36 0415 DCFB ^19 MOS36 0400 DCED ; MOS36 0415 DCFB ^19 MOS36 0401 DCED ; MOS36 0415 DCFB ^19 MOS36 0402 DCED 2D 77 02 AND B6522 ;suppress bits if secondary 6522 not present MOS36 0415 DCFB ^19 MOS36 0403 DCF0 2D 6E FE AND IERR ;only look at enabled interrupts MOS36 0415 DCFB ^19 MOS36 0404 DCF3 6A RORA ;A = IFR >> 1 MOS36 0415 DCFB ^19 MOS36 0405 DCF4 6A RORA ;A = IFR >> 2, C = CA1 MOS36 0415 DCFB ^19 MOS36 0406 DCF5 90 9F BCC UNKIRQ ;[not a printer interrupt] MOS36 0415 DCFB ^19 MOS36 0407 DCF7 ; MOS36 0415 DCFB ^19 MOS36 0408 DCF7 IPRNT ;printer interrupt MOS36 0415 DCFB ^19 MOS36 0409 DCF7 ; MOS36 0415 DCFB ^19 MOS36 0410 DCF7 ; acknowledge interrupt MOS36 0415 DCFB ^19 MOS36 0411 DCF7 ; N.B. clear before sending next character since printer MOS36 0415 DCFB ^19 MOS36 0412 DCF7 ; may acknowledge quickly and we could miss the interrupt MOS36 0415 DCFB ^19 MOS36 0413 DCF7 AC 85 02 LDY PRNTSW MOS36 0415 DCFB ^19 MOS36 0414 DCFA 88 DEY ;******** ASSUMES PCEN = 1 ******** MOS36 0415 DCFB ^19 MOS36 0415 DCFB D0 99 BNE UNKIRQ ;[ignore printer interrupt cos centronics not selected] MOS36 0341 DCB6 v2D MOS36 0416 DCFD ; MOS36 0341 DCB6 v2D MOS36 0417 DCFD A9 02 LDAIM PRNT MOS36 0341 DCB6 v2D MOS36 0418 DCFF 8D 6D FE STA IFRR ;acknowledge interrupt MOS36 0341 DCB6 v2D MOS36 0419 DD02 8D 6E FE STA IERR ;disable printer interrupt MOS36 0341 DCB6 v2D MOS36 0420 DD05 ; (will be enabled again by STROBE if another character is sent MOS36 0341 DCB6 v2D MOS36 0421 DD05 ; using the parallel port) MOS36 0341 DCB6 v2D MOS36 0422 DD05 ; MOS36 0341 DCB6 v2D MOS36 0423 DD05 A2 03 LDXIM BPRNT ;X := print bufferid MOS36 0341 DCB6 v2D MOS36 0424 DD07 4C 8C E1 JMP STROBE ;if character read then print it AND return from interrupt MOS36 0341 DCB6 v2D MOS36 0425 DD0A MOS36 0341 DCB6 v2D MOS36 0426 DD0A MOS36 0341 DCB6 v2D MOS36 0427 DD0A ITIME2 ;check for TIMER2 interrupt MOS36 0341 DCB6 v2D MOS36 0428 DD0A ; MOS36 0341 DCB6 v2D MOS36 0429 DD0A 2A ROLA ;A = IFR >> 1 -- MOS36 0430 DD0B 2A ROLA ;A = IFR -- MOS36 0431 DD0C 2A ROLA ;:A = IFR << 1, N = TIMER1 -- MOS36 0432 DD0D 2A ROLA ;A = IFR << 2, N = TIMER2, C = TIMER1 -- MOS36 0433 DD0E 10 5B BPL ITIME1 ;[not TIMER2, check for TIMER1 interrupt] MOS36 0433 DD0E v24 MOS36 0434 DD10 [ NOSP = &00 MOS36 0433 DD0E v24 MOS36 0437 DD10 | MOS36 0433 DD0E v24 MOS36 0438 DD10 ; MOS36 0433 DD0E v24 MOS36 0439 DD10 ; timer 2 interrupt MOS36 0433 DD0E v24 MOS36 0440 DD10 ; acknowledge interrupt MOS36 0433 DD0E v24 MOS36 0441 DD10 ; MOS36 0433 DD0E v24 MOS36 0442 DD10 ; and MOS36 0433 DD0E v24 MOS36 0443 DD10 ; MOS36 0433 DD0E v24 MOS36 0444 DD10 ; set speech RDY to interrupt again MOS36 0433 DD0E v24 MOS36 0445 DD10 ; MOS36 0433 DD0E v24 MOS36 0446 DD10 A9 20 LDAIM TIMER2 MOS36 0433 DD0E v24 MOS36 0447 DD12 A2 00 LDXIM ZERO MOS36 0433 DD0E v24 MOS36 0448 DD14 ; N.B. minimise time between next two instructions MOS36 0433 DD0E v24 MOS36 0449 DD14 8D 4D FE STA IFRQ ;clear interrupt MOS36 0433 DD0E v24 MOS36 0450 DD17 8E 49 FE STX TRCHQ ;set to interrupt on speech chip INT MOS36 0433 DD0E v24 MOS36 0451 DD1A ; MOS36 0433 DD0E v24 MOS36 0452 DD1A ; process speech request MOS36 0433 DD0E v24 MOS36 0453 DD1A ; MOS36 0433 DD0E v24 MOS36 0454 DD1A PRSPRQ ;process speech request MOS36 0433 DD0E v24 MOS36 0455 DD1A ; MOS36 0433 DD0E v24 MOS36 0456 DD1A ; set speak external repeat counter to 4 MOS36 0433 DD0E v24 MOS36 0457 DD1A ; MOS36 0433 DD0E v24 MOS36 0458 DD1A A2 08 LDXIM BSPCH MOS36 0433 DD0E v24 MOS36 0459 DD1C 86 FB STX SPWK2 ;**** ASSUMES BSPCH=8 **** MOS36 0433 DD0E v24 MOS36 0460 DD1E ; MOS36 0433 DD0E v24 MOS36 0461 DD1E SPEREP ;repeat poke of speak external data MOS36 0433 DD0E v24 MOS36 0462 DD1E ; MOS36 0433 DD0E v24 MOS36 0463 DD1E ; inspect speech buffer MOS36 0433 DD0E v24 MOS36 0464 DD1E ; MOS36 0433 DD0E v24 MOS36 0465 DD1E 20 9F E4 JSR EXAM MOS36 0433 DD0E v24 MOS36 0466 DD21 ; MOS36 0433 DD0E v24 MOS36 0467 DD21 ; record buffer status - MI => dormant, PL => busy MOS36 0433 DD0E v24 MOS36 0468 DD21 ; MOS36 0433 DD0E v24 MOS36 0469 DD21 6E D7 02 ROR SPSTAT MOS36 0433 DD0E v24 MOS36 0470 DD24 30 44 BMI NSPECH ;[buffer empty] MOS36 0433 DD0E v24 MOS36 0471 DD26 ; MOS36 0433 DD0E v24 MOS36 0472 DD26 A8 TAY MOS36 0433 DD0E v24 MOS36 0473 DD27 F0 05 BEQ SPOK ;[speak external data] MOS36 0433 DD0E v24 MOS36 0474 DD29 ; MOS36 0433 DD0E v24 MOS36 0475 DD29 ; new command - ensure not talking MOS36 0433 DD0E v24 MOS36 0476 DD29 ; MOS36 0433 DD0E v24 MOS36 0477 DD29 20 89 EE JSR RSPECH MOS36 0433 DD0E v24 MOS36 0478 DD2C 30 3C BMI NSPECH ;[talking active] MOS36 0433 DD0E v24 MOS36 0479 DD2E ; MOS36 0433 DD0E v24 MOS36 0480 DD2E ; new command and not talking MOS36 0433 DD0E v24 MOS36 0481 DD2E ; MOS36 0433 DD0E v24 MOS36 0482 DD2E SPOK ;speak external data MOS36 0433 DD0E v24 MOS36 0483 DD2E ; MOS36 0433 DD0E v24 MOS36 0484 DD2E ; get command byte from speech buffer MOS36 0433 DD0E v24 MOS36 0485 DD2E ; MOS36 0433 DD0E v24 MOS36 0486 DD2E 20 A4 E4 JSR REMOV MOS36 0433 DD0E v24 MOS36 0487 DD31 ; MOS36 0433 DD0E v24 MOS36 0488 DD31 ; codeword in A MOS36 0433 DD0E v24 MOS36 0489 DD31 ; MOS36 0433 DD0E v24 MOS36 0490 DD31 85 F5 STA SEROM MOS36 0433 DD0E v24 MOS36 0491 DD33 ; MOS36 0433 DD0E v24 MOS36 0492 DD33 ; pull data MOS36 0433 DD0E v24 MOS36 0493 DD33 ; MOS36 0433 DD0E v24 MOS36 0494 DD33 20 A4 E4 JSR REMOV MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 67 MOS36 IRQ processing MOS36 MOS36 0433 DD0E v24 MOS36 0495 DD36 85 F7 STA ROMPTR+&01 ;hi-address / hi-data MOS36 0433 DD0E v24 MOS36 0496 DD38 20 A4 E4 JSR REMOV MOS36 0433 DD0E v24 MOS36 0497 DD3B 85 F6 STA ROMPTR+&00 ;lo-address / lo-data MOS36 0433 DD0E v24 MOS36 0498 DD3D ; MOS36 0433 DD0E v24 MOS36 0499 DD3D ; switch on codeword MOS36 0433 DD0E v24 MOS36 0500 DD3D ; MOS36 0433 DD0E v24 MOS36 0501 DD3D A4 F5 LDY SEROM MOS36 0433 DD0E v24 MOS36 0502 DD3F F0 1B BEQ ISP2 ;[command=0, do not treat codeword as a command] MOS36 0433 DD0E v24 MOS36 0503 DD41 10 16 BPL ISP3 ;[command>0, speech command without address] MOS36 0433 DD0E v24 MOS36 0504 DD43 ; MOS36 0433 DD0E v24 MOS36 0505 DD43 ; command with address MOS36 0433 DD0E v24 MOS36 0506 DD43 ; command either speak(address) OR read-and-branch(address) MOS36 0433 DD0E v24 MOS36 0507 DD43 ; MOS36 0433 DD0E v24 MOS36 0508 DD43 ; check for read and branch request MOS36 0433 DD0E v24 MOS36 0509 DD43 ; MOS36 0433 DD0E v24 MOS36 0510 DD43 24 F5 BIT SEROM MOS36 0433 DD0E v24 MOS36 0511 DD45 70 05 BVS RAB ;[read and branch] MOS36 0433 DD0E v24 MOS36 0512 DD47 ; MOS36 0433 DD0E v24 MOS36 0513 DD47 ; speak(address) MOS36 0433 DD0E v24 MOS36 0514 DD47 ; load address into speech processor MOS36 0433 DD0E v24 MOS36 0515 DD47 ; MOS36 0433 DD0E v24 MOS36 0516 DD47 ; V=0 MOS36 0433 DD0E v24 MOS36 0517 DD47 20 D7 EE JSR SPLOAD ;N.B. does PHP...PLP MOS36 0433 DD0E v24 MOS36 0518 DD4A 50 07 BVC ISPX ;[ALWAYS jump] MOS36 0433 DD0E v24 MOS36 0519 DD4C ; MOS36 0433 DD0E v24 MOS36 0520 DD4C RAB ;read and branch (speak indirect) MOS36 0433 DD0E v24 MOS36 0521 DD4C ; MOS36 0433 DD0E v24 MOS36 0522 DD4C ; multiply offset by two MOS36 0433 DD0E v24 MOS36 0523 DD4C ; MOS36 0433 DD0E v24 MOS36 0524 DD4C 06 F6 ASL ROMPTR+&00 MOS36 0433 DD0E v24 MOS36 0525 DD4E 26 F7 ROL ROMPTR+&01 MOS36 0433 DD0E v24 MOS36 0526 DD50 ; MOS36 0433 DD0E v24 MOS36 0527 DD50 ; reselect address MOS36 0433 DD0E v24 MOS36 0528 DD50 ; MOS36 0433 DD0E v24 MOS36 0529 DD50 20 58 EE JSR SPLIND ;load address indirect MOS36 0433 DD0E v24 MOS36 0530 DD53 ; MOS36 0433 DD0E v24 MOS36 0531 DD53 ISPX MOS36 0433 DD0E v24 MOS36 0532 DD53 AC 61 02 LDY SHUTSP ;command defaults to speech MOS36 0433 DD0E v24 MOS36 0533 DD56 4C 9B EE JMP WSPECH ;send command AND return MOS36 0433 DD0E v24 MOS36 0534 DD59 ; MOS36 0433 DD0E v24 MOS36 0535 DD59 ; MOS36 0433 DD0E v24 MOS36 0536 DD59 ISP3 ;treat codeword as a command MOS36 0433 DD0E v24 MOS36 0537 DD59 ; MOS36 0433 DD0E v24 MOS36 0538 DD59 20 9B EE JSR WSPECH ;issue codeword command MOS36 0433 DD0E v24 MOS36 0539 DD5C ; MOS36 0433 DD0E v24 MOS36 0540 DD5C ISP2 ;write argument data bytes MOS36 0433 DD0E v24 MOS36 0541 DD5C ; MOS36 0433 DD0E v24 MOS36 0542 DD5C A4 F6 LDY ROMPTR+&00 MOS36 0433 DD0E v24 MOS36 0543 DD5E 20 9B EE JSR WSPECH MOS36 0433 DD0E v24 MOS36 0544 DD61 A4 F7 LDY ROMPTR+&01 MOS36 0433 DD0E v24 MOS36 0545 DD63 20 9B EE JSR WSPECH MOS36 0433 DD0E v24 MOS36 0546 DD66 ; MOS36 0433 DD0E v24 MOS36 0547 DD66 ; repeat poke of speak external data up to 4 times (8 bytes) MOS36 0433 DD0E v24 MOS36 0548 DD66 ; MOS36 0433 DD0E v24 MOS36 0549 DD66 46 FB LSR SPWK2 MOS36 0433 DD0E v24 MOS36 0550 DD68 D0 B4 BNE SPEREP ;[try poking more speak external data] MOS36 0433 DD0E v24 MOS36 0551 DD6A ; MOS36 0433 DD0E v24 MOS36 0552 DD6A NSPECH MOS36 0433 DD0E v24 MOS36 0553 DD6A 60 RTS MOS36 0433 DD0E v24 MOS36 0554 DD6B ] MOS36 0433 DD0E v24 MOS36 0555 DD6B MOS36 0433 DD0E v24 MOS36 0556 DD6B MOS36 0433 DD0E v24 MOS36 0557 DD6B MOS36 0433 DD0E v24 MOS36 0558 DD6B ITIME1 ;check for TIMER1 interrupt MOS36 0433 DD0E v24 MOS36 0559 DD6B ; MOS36 0433 DD0E v24 MOS36 0560 DD6B 90 7B BCC IADC ;[not TIMER1, check for ADC interrupt] MOS36 0560 DD6B v04 MOS36 0561 DD6D ; C=1 MOS36 0560 DD6B v04 MOS36 0562 DD6D ; MOS36 0560 DD6B v04 MOS36 0563 DD6D ; main clock interrupt MOS36 0560 DD6B v04 MOS36 0564 DD6D ; MOS36 0560 DD6B v04 MOS36 0565 DD6D ; clear interrupt MOS36 0560 DD6B v04 MOS36 0566 DD6D ; MOS36 0560 DD6B v04 MOS36 0567 DD6D A9 40 LDAIM CLOCK MOS36 0560 DD6B v04 MOS36 0568 DD6F 8D 4D FE STA IFRQ ;acknowledge clock interrupt MOS36 0560 DD6B v04 MOS36 0569 DD72 ; C=1 MOS36 0560 DD6B v04 MOS36 0570 DD72 ; MOS36 0560 DD6B v04 MOS36 0571 DD72 ; increment absolute time MOS36 0560 DD6B v04 MOS36 0572 DD72 ; MOS36 0560 DD6B v04 MOS36 0573 DD72 AD 83 02 LDA TIMESW MOS36 0560 DD6B v04 MOS36 0574 DD75 AA TAX ;X -> current timer MOS36 0560 DD6B v04 MOS36 0575 DD76 49 0F EORIM &0F MOS36 0560 DD6B v04 MOS36 0576 DD78 48 PHA MOS36 0560 DD6B v04 MOS36 0577 DD79 A8 TAY ;Y -> other timer MOS36 0560 DD6B v04 MOS36 0578 DD7A ; C=1 MOS36 0560 DD6B v04 MOS36 0579 DD7A ;****SEC ;N.B. add 1 to timer MOS36 0560 DD6B v04 MOS36 0580 DD7A ; MOS36 0560 DD6B v04 MOS36 0581 DD7A IT1 MOS36 0560 DD6B v04 MOS36 0582 DD7A BD 91 02 LDAAX TIME -&01 MOS36 0560 DD6B v04 MOS36 0583 DD7D 69 00 ADCIM ZERO MOS36 0560 DD6B v04 MOS36 0584 DD7F 99 91 02 STAAY TIME -&01 MOS36 0560 DD6B v04 MOS36 0585 DD82 CA DEX MOS36 0560 DD6B v04 MOS36 0586 DD83 F0 03 BEQ IT2 MOS36 0560 DD6B v04 MOS36 0587 DD85 88 DEY MOS36 0560 DD6B v04 MOS36 0588 DD86 D0 F2 BNE IT1 MOS36 0560 DD6B v04 MOS36 0589 DD88 IT2 MOS36 0560 DD6B v04 MOS36 0590 DD88 ; MOS36 0560 DD6B v04 MOS36 0591 DD88 68 PLA MOS36 0560 DD6B v04 MOS36 0592 DD89 8D 83 02 STA TIMESW ;switch timers MOS36 0560 DD6B v04 MOS36 0593 DD8C ; MOS36 0560 DD6B v04 MOS36 0594 DD8C ; MOS36 0560 DD6B v04 MOS36 0595 DD8C A2 05 LDXIM &05 MOS36 0560 DD6B v04 MOS36 0596 DD8E IVIAA5 MOS36 0560 DD6B v04 MOS36 0597 DD8E FE 9B 02 INCAX STPW -&01 MOS36 0560 DD6B v04 MOS36 0598 DD91 D0 08 BNE IINKEY MOS36 0560 DD6B v04 MOS36 0599 DD93 CA DEX MOS36 0560 DD6B v04 MOS36 0600 DD94 D0 F8 BNE IVIAA5 MOS36 0560 DD6B v04 MOS36 0601 DD96 ; MOS36 0560 DD6B v04 MOS36 0602 DD96 ; stopwatch timeout MOS36 0560 DD6B v04 MOS36 0603 DD96 ; MOS36 0560 DD6B v04 MOS36 0604 DD96 A0 05 LDYIM EVSWCH MOS36 0560 DD6B v04 MOS36 0605 DD98 20 D8 E4 JSR EVENT MOS36 0560 DD6B v04 MOS36 0606 DD9B ; MOS36 0560 DD6B v04 MOS36 0607 DD9B IINKEY ;decrement INKEY counter MOS36 0560 DD6B v04 MOS36 0608 DD9B ; MOS36 0560 DD6B v04 MOS36 0609 DD9B AD B1 02 LDA RDCTLO MOS36 0560 DD6B v04 MOS36 0610 DD9E D0 08 BNE IIN1 ;[just decrement lo] MOS36 0560 DD6B v04 MOS36 0611 DDA0 ; lo zero MOS36 0560 DD6B v04 MOS36 0612 DDA0 AD B2 02 LDA RDCTHI MOS36 0560 DD6B v04 MOS36 0613 DDA3 F0 06 BEQ IIN0 ;[counter zero] MOS36 0560 DD6B v04 MOS36 0614 DDA5 ; decrement lo and hi MOS36 0560 DD6B v04 MOS36 0615 DDA5 CE B2 02 DEC RDCTHI MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 68 MOS36 IRQ processing MOS36 MOS36 0560 DD6B v04 MOS36 0616 DDA8 IIN1 ;just decrement lo MOS36 0560 DD6B v04 MOS36 0617 DDA8 CE B1 02 DEC RDCTLO MOS36 0560 DD6B v04 MOS36 0618 DDAB IIN0 ;counter zero MOS36 0560 DD6B v04 MOS36 0619 DDAB MOS36 0560 DD6B v04 MOS36 0620 DDAB [ $Tutu ; no sound, no speech shit wanted - nothing from this point on MOS36 0560 DD6B v04 MOS36 0624 DDAB | MOS36 0560 DD6B v04 MOS36 0625 DDAB ; MOS36 0560 DD6B v04 MOS36 0626 DDAB ; MOS36 0560 DD6B v04 MOS36 0627 DDAB ; check sound sema to ensure exclusive access to sound code MOS36 0560 DD6B v04 MOS36 0628 DDAB ; MOS36 0560 DD6B v04 MOS36 0629 DDAB 2C CE 02 BIT SSEMA MOS36 0560 DD6B v04 MOS36 0630 DDAE ] MOS36 0560 DD6B v04 MOS36 0631 DDAE 10 0B BPL SINUSE ;[sound software in use] MOS36 0560 DD6B v04 MOS36 0632 DDB0 ; MOS36 0560 DD6B v04 MOS36 0633 DDB0 ; sound software available MOS36 0560 DD6B v04 MOS36 0634 DDB0 ; MOS36 0560 DD6B v04 MOS36 0635 DDB0 EE CE 02 INC SSEMA ;claim sound sema MOS36 0560 DD6B v04 MOS36 0636 DDB3 58 CLI ;enable interrupts during sound processing MOS36 0560 DD6B v04 MOS36 0637 DDB4 20 81 EB JSR SNDIRQ MOS36 0560 DD6B v04 MOS36 0638 DDB7 78 SEI ;disable interrupts after sound processing MOS36 0560 DD6B v04 MOS36 0639 DDB8 CE CE 02 DEC SSEMA ;release sound sema MOS36 0560 DD6B v04 MOS36 0640 DDBB SINUSE MOS36 0560 DD6B v04 MOS36 0641 DDBB [ NOSP = &00 MOS36 0560 DD6B v04 MOS36 0643 DDBB | MOS36 0560 DD6B v04 MOS36 0644 DDBB ; MOS36 0560 DD6B v04 MOS36 0645 DDBB ; give speech a chance MOS36 0560 DD6B v04 MOS36 0646 DDBB ; MOS36 0560 DD6B v04 MOS36 0647 DDBB ; check buffer MOS36 0560 DD6B v04 MOS36 0648 DDBB ; MOS36 0560 DD6B v04 MOS36 0649 DDBB 2C D7 02 BIT SPSTAT MOS36 0560 DD6B v04 MOS36 0650 DDBE 30 0C BMI SPBUSY ;[speech buffer empty] MOS36 0560 DD6B v04 MOS36 0651 DDC0 ; MOS36 0560 DD6B v04 MOS36 0652 DDC0 ; read speech chip status MOS36 0560 DD6B v04 MOS36 0653 DDC0 ; MOS36 0560 DD6B v04 MOS36 0654 DDC0 20 89 EE JSR RSPECH ;N.B. does not alter A if speech chip not present MOS36 0560 DD6B v04 MOS36 0655 DDC3 ; MOS36 0560 DD6B v04 MOS36 0656 DDC3 ; A>=$80 => busy MOS36 0560 DD6B v04 MOS36 0657 DDC3 ; MOS36 0560 DD6B v04 MOS36 0658 DDC3 ; N.B. if speech chip does not exist then 25% chance that PRSPRQ will MOS36 0560 DD6B v04 MOS36 0659 DDC3 ; be called, this will just result in a no-operation effect MOS36 0560 DD6B v04 MOS36 0660 DDC3 ; MOS36 0560 DD6B v04 MOS36 0661 DDC3 49 A0 EORIM &A0 MOS36 0560 DD6B v04 MOS36 0662 DDC5 C9 60 CMPIM &60 MOS36 0560 DD6B v04 MOS36 0663 DDC7 90 03 BCC SPBUSY ;[100, 101 or 111] MOS36 0560 DD6B v04 MOS36 0664 DDC9 ; MOS36 0560 DD6B v04 MOS36 0665 DDC9 20 1A DD JSR PRSPRQ ;process speech request MOS36 0560 DD6B v04 MOS36 0666 DDCC ] MOS36 0560 DD6B v04 MOS36 0667 DDCC ; MOS36 0560 DD6B v04 MOS36 0668 DDCC SPBUSY ;speech chip busy MOS36 0560 DD6B v04 MOS36 0669 DDCC ; MOS36 0560 DD6B v04 MOS36 0670 DDCC ; check RS423 for possible Tx MOS36 0560 DD6B v04 MOS36 0671 DDCC ; MOS36 0560 DD6B v04 MOS36 0672 DDCC 2C 49 D9 BIT FFBYT ;indicate timer interrupt call MOS36 0560 DD6B v04 MOS36 0673 DDCF 20 45 DC JSR IRQ68 MOS36 0560 DD6B v04 MOS36 0674 DDD2 ; MOS36 0560 DD6B v04 MOS36 0675 DDD2 ; check keyboard if keys active MOS36 0560 DD6B v04 MOS36 0676 DDD2 ; MOS36 0560 DD6B v04 MOS36 0677 DDD2 A5 EC LDA CKEY MOS36 0560 DD6B v04 MOS36 0678 DDD4 05 ED ORA OKEY MOS36 0560 DD6B v04 MOS36 0679 DDD6 2D 42 02 AND KSEMA ;check for keyboard critical region MOS36 0560 DD6B v04 MOS36 0680 DDD9 F0 04 BEQ ICLK0 ;[no keys active, clear timer interrupt] MOS36 0560 DD6B v04 MOS36 0681 DDDB 38 SEC MOS36 0560 DD6B v04 MOS36 0682 DDDC 20 74 F0 JSR JMIKYV ;key(s) active, process timer interrupt MOS36 0560 DD6B v04 MOS36 0683 DDDF ; ******** MAY ENABLE INTERRUPTS (EXITS DISABLED) ******** MOS36 0560 DD6B v04 MOS36 0684 DDDF ; MOS36 0560 DD6B v04 MOS36 0685 DDDF ICLK0 MOS36 0560 DD6B v04 MOS36 0686 DDDF ; give user print routine a chance MOS36 0560 DD6B v04 MOS36 0687 DDDF 20 EB E1 JSR UPTINT MOS36 0560 DD6B v04 MOS36 0688 DDE2 ; MOS36 0560 DD6B v04 MOS36 0689 DDE2 ; the ADC is connected on CB1 MOS36 0560 DD6B v04 MOS36 0690 DDE2 ; when port B is read (by keyboard routines) any MOS36 0560 DD6B v04 MOS36 0691 DDE2 ; interrupt is lost, and the ADC must be restarted MOS36 0560 DD6B v04 MOS36 0692 DDE2 ; MOS36 0560 DD6B v04 MOS36 0693 DDE2 2C C0 FE BIT ADCCTL MOS36 0560 DD6B v04 MOS36 0694 DDE5 70 04 BVS IADCB ;[ADC not busy] MOS36 0560 DD6B v04 MOS36 0695 DDE7 60 RTS ;return from interrupt MOS36 0560 DD6B v04 MOS36 0696 DDE8 MOS36 0560 DD6B v04 MOS36 0697 DDE8 MOS36 0560 DD6B v04 MOS36 0698 DDE8 IADC ;check for ADC interrupt MOS36 0560 DD6B v04 MOS36 0699 DDE8 ; MOS36 0560 DD6B v04 MOS36 0700 DDE8 2A ROLA ;A = IFR << 3, N = CB1 MOS36 0694 DDE5 v7B MOS36 0701 DDE9 10 28 BPL IKEYBD ;[not an ADC intterupt] MOS36 0701 DDE9 v57 MOS36 0702 DDEB ; MOS36 0701 DDE9 v57 MOS36 0703 DDEB ; ADC interrupt MOS36 0701 DDE9 v57 MOS36 0704 DDEB ; check ADC enabled MOS36 0701 DDE9 v57 MOS36 0705 DDEB ; MOS36 0701 DDE9 v57 MOS36 0706 DDEB IADCB MOS36 0701 DDE9 v57 MOS36 0707 DDEB AE 4C 02 LDX ADCHAN MOS36 0701 DDE9 v57 MOS36 0708 DDEE F0 1D BEQ IADC0 ;[ADC disabled] MOS36 0701 DDE9 v57 MOS36 0709 DDF0 ; MOS36 0701 DDE9 v57 MOS36 0710 DDF0 ; read conversion lo byte MOS36 0701 DDE9 v57 MOS36 0711 DDF0 ; MOS36 0701 DDE9 v57 MOS36 0712 DDF0 AD C2 FE LDA ADCLO MOS36 0701 DDE9 v57 MOS36 0713 DDF3 9D B5 02 STAAX ADCLOV -&01 MOS36 0701 DDE9 v57 MOS36 0714 DDF6 ; MOS36 0701 DDE9 v57 MOS36 0715 DDF6 ; read conversion hi byte MOS36 0701 DDE9 v57 MOS36 0716 DDF6 ; MOS36 0701 DDE9 v57 MOS36 0717 DDF6 AD C1 FE LDA ADCHI MOS36 0701 DDE9 v57 MOS36 0718 DDF9 9D B9 02 STAAX ADCHIV -&01 MOS36 0701 DDE9 v57 MOS36 0719 DDFC ; MOS36 0701 DDE9 v57 MOS36 0720 DDFC ; set latest conversion number MOS36 0701 DDE9 v57 MOS36 0721 DDFC ; MOS36 0701 DDE9 v57 MOS36 0722 DDFC 8E BE 02 STX ADCFLG MOS36 0701 DDE9 v57 MOS36 0723 DDFF ; MOS36 0701 DDE9 v57 MOS36 0724 DDFF ; signal ADC conversion event, X = channel number MOS36 0701 DDE9 v57 MOS36 0725 DDFF ; MOS36 0701 DDE9 v57 MOS36 0726 DDFF A0 03 LDYIM EVADC MOS36 0701 DDE9 v57 MOS36 0727 DE01 20 D8 E4 JSR EVENT MOS36 0701 DDE9 v57 MOS36 0728 DE04 ; MOS36 0701 DDE9 v57 MOS36 0729 DE04 ; step to next channel MOS36 0701 DDE9 v57 MOS36 0730 DE04 ; MOS36 0701 DDE9 v57 MOS36 0731 DE04 CA DEX MOS36 0701 DDE9 v57 MOS36 0732 DE05 D0 03 BNE IADC2 ;[channel >= 1] MOS36 0701 DDE9 v57 MOS36 0733 DE07 ; MOS36 0701 DDE9 v57 MOS36 0734 DE07 ; channel counter underflow MOS36 0701 DDE9 v57 MOS36 0735 DE07 ; reload channel counter MOS36 0701 DDE9 v57 MOS36 0736 DE07 ; MOS36 0701 DDE9 v57 MOS36 0737 DE07 AE 4D 02 LDX MAXADC MOS36 0701 DDE9 v57 MOS36 0738 DE0A IADC2 MOS36 0701 DDE9 v57 MOS36 0739 DE0A ; MOS36 0701 DDE9 v57 MOS36 0740 DE0A ; initiate next conversion MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 69 MOS36 IRQ processing MOS36 MOS36 0701 DDE9 v57 MOS36 0741 DE0A ; X = channel number MOS36 0701 DDE9 v57 MOS36 0742 DE0A ; MOS36 0701 DDE9 v57 MOS36 0743 DE0A 20 3B DE JSR ADCBGX ;begin conversion, sets ADCHAN=X MOS36 0701 DDE9 v57 MOS36 0744 DE0D IADC0 MOS36 0701 DDE9 v57 MOS36 0745 DE0D A9 10 LDAIM ADC MOS36 0701 DDE9 v57 MOS36 0746 DE0F IVIAA0 ;return from VIAA interrupt MOS36 0701 DDE9 v57 MOS36 0747 DE0F 8D 4D FE STA IFRQ ;clear interrupt state MOS36 0701 DDE9 v57 MOS36 0748 DE12 60 RTS ;return from interrupt MOS36 0701 DDE9 v57 MOS36 0749 DE13 MOS36 0701 DDE9 v57 MOS36 0750 DE13 MOS36 0701 DDE9 v57 MOS36 0751 DE13 IKEYBD ;keyboard interrupt check MOS36 0701 DDE9 v57 MOS36 0752 DE13 ; MOS36 0701 DDE9 v57 MOS36 0753 DE13 2A ROLA ;A = IFR << 4 MOS36 0764 DE1E ^6F MOS36 0754 DE14 2A ROLA ;A = IFR << 5 MOS36 0764 DE1E ^6F MOS36 0755 DE15 2A ROLA ;A = IFR << 6 MOS36 0764 DE1E ^6F MOS36 0756 DE16 2A ROLA ;A = IFR << 7, N = CA2 MOS36 0764 DE1E ^6F MOS36 0757 DE17 10 07 BPL JUNKIRQ ;[not keyboard interrupt] MOS36 0764 DE1E ^6F MOS36 0758 DE19 ; MOS36 0764 DE1E ^6F MOS36 0759 DE19 ; C=0 because no VSYNC MOS36 0764 DE1E ^6F MOS36 0760 DE19 ; MOS36 0764 DE1E ^6F MOS36 0761 DE19 20 74 F0 JSR JMIKYV ;find and set up new current key (enter with C=0) MOS36 0764 DE1E ^6F MOS36 0762 DE1C ; ******** MAY ENABLE INTERRUPTS (EXITS DISABLED) ******** MOS36 0764 DE1E ^6F MOS36 0763 DE1C A9 01 LDAIM KEYBD MOS36 0764 DE1E ^6F MOS36 0764 DE1E D0 EF BNE IVIAA0 ;[ALWAYS jump] MOS36 0757 DE17 v78 MOS36 0765 DE20 ; MOS36 0757 DE17 v78 MOS36 0766 DE20 4C 96 DC JUNKIRQ JMP UNKIRQ ;IRQ not identified -- MOS36 0767 DE23 -- MOS36 0768 DE23 -- MOS36 0769 DE23 -- MOS36 0770 DE23 [ MOS125 = &FF -- MOS36 0771 DE23 | -- MOS36 0772 DE23 DEFIRQ ;default IRQ routine -- MOS36 0773 DE23 D8 CLD -- MOS36 0774 DE24 A5 FC LDA TEMPA -- MOS36 0775 DE26 48 PHA -- MOS36 0776 DE27 8A TXA -- MOS36 0777 DE28 48 PHA -- MOS36 0778 DE29 98 TYA -- MOS36 0779 DE2A 48 PHA -- MOS36 0780 DE2B ; -- MOS36 0781 DE2B ; schedule return from interrupt -- MOS36 0782 DE2B ; -- MOS36 0783 DE2B 20 44 DC JSR VAT -- MOS36 0784 DE2E ] -- MOS36 0785 DE2E IRQ0 ;return from interrupt restoring registers -- MOS36 0786 DE2E 68 PLA -- MOS36 0787 DE2F A8 TAY -- MOS36 0788 DE30 68 PLA -- MOS36 0789 DE31 AA TAX -- MOS36 0790 DE32 68 PLA -- MOS36 0791 DE33 85 FC STA TEMPA -- MOS36 0792 DE35 ; -- MOS36 0793 DE35 IRQTWO -- MOS36 0794 DE35 A5 FC LDA TEMPA -- MOS36 0795 DE37 40 RTI -- MOS36 0796 DE38 -- MOS36 0797 DE38 -- MOS36 0798 DE38 ADCBEG ;begin forced ADC conversion -- MOS36 0799 DE38 ; -- MOS36 0800 DE38 ; X = external channel number -- MOS36 0801 DE38 ; Y = 0 -- MOS36 0802 DE38 ; -- MOS36 0803 DE38 8C BE 02 STY ADCFLG ;clear conversion number -- MOS36 0804 DE3B ; -- MOS36 0805 DE3B ADCBGX ;begin ADC conversion -- MOS36 0806 DE3B ; -- MOS36 0807 DE3B ; X = external channel number -- MOS36 0808 DE3B ; Y corrupted -- MOS36 0809 DE3B ; -- MOS36 0810 DE3B E0 05 CPXIM NADC +&01 -- MOS36 0811 DE3D 90 02 BCC ADCBG1 ;[valid channel number] MOS36 0811 DE3D v7D MOS36 0812 DE3F A2 04 LDXIM NADC ;force valid channel number MOS36 0811 DE3D v7D MOS36 0813 DE41 ADCBG1 ;channel number now valid (but possibly 0) MOS36 0811 DE3D v7D MOS36 0814 DE41 ; MOS36 0811 DE3D v7D MOS36 0815 DE41 8E 4C 02 STX ADCHAN -- MOS36 0816 DE44 AC 4E 02 LDY ADCCNV ;normally 0, 8 or 12 (0 has same effect as 12) -- MOS36 0817 DE47 88 DEY -- MOS36 0818 DE48 98 TYA -- MOS36 0819 DE49 29 08 ANDIM &08 ;extract conversion type -- MOS36 0820 DE4B 18 CLC -- MOS36 0821 DE4C 6D 4C 02 ADC ADCHAN -- MOS36 0822 DE4F ; C=0 -- MOS36 0823 DE4F E9 00 SBCIM ZERO ;subtract 1, add in INTERNAL channel number (1->0 ... 4->3) -- MOS36 0824 DE51 8D C0 FE STA ADCCTL ;start conversion -- MOS36 0825 DE54 ; -- MOS36 0826 DE54 ; if X was 0 on entry then a conversion is initiated on channel 3 -- MOS36 0827 DE54 ; of the opposite conversion type to that expected, but the result -- MOS36 0828 DE54 ; of this conversion will be ignored -- MOS36 0829 DE54 ; -- MOS36 0830 DE54 60 RTS -- MOS36 0831 DE55 -- MOS36 0832 DE55 -- MOS36 0833 DE55 WRSTR ;write string -- MOS36 0834 DE55 ; -- MOS36 0835 DE55 A9 C3 LDAIM /MSG -- MOS36 0836 DE57 WRSTRA -- MOS36 0837 DE57 85 FE STA REPTR +&01 -- MOS36 0838 DE59 A9 00 LDAIM ZERO -- MOS36 0839 DE5B 85 FD STA REPTR +&00 -- MOS36 0840 DE5D WRSTR1 -- MOS36 0841 DE5D C8 INY MOS36 0845 DE64 ^77 MOS36 0842 DE5E B1 FD LDAIY REPTR MOS36 0845 DE64 ^77 MOS36 0843 DE60 20 E3 FF JSR OSASCI ;write message character MOS36 0845 DE64 ^77 MOS36 0844 DE63 AA TAX MOS36 0845 DE64 ^77 MOS36 0845 DE64 D0 F7 BNE WRSTR1 ;[ALWAYS jump, step to next message character] -- MOS36 0846 DE66 ; terminator found -- MOS36 0847 DE66 60 RTS -- MOS36 0848 DE67 -- MOS36 0849 DE67 -- MOS36 0850 DE67 LNK MOS38 -- MOS38 0001 DE67 ; > MOS38 -- MOS38 0002 DE67 TTL MOS38 CLI -- MOS38 0003 DE67 OPT MOS38 MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 70 MOS38 MOS38 CLI MOS38 -- MOS38 0004 DE67 ;(c) 1981 ACORN -- MOS38 0005 DE67 ;BBC MOS -- MOS38 0006 DE67 ;Change record: -- MOS38 0007 DE67 ;004 29-Jul-81 MP Prototype version -- MOS38 0008 DE67 ;Author(s): -- MOS38 0009 DE67 ;PB Paul Bond -- MOS38 0010 DE67 ;MP Mike Prees -- MOS38 0011 DE67 -- MOS38 0012 DE67 -- MOS38 0013 DE67 ; RDCH -- MOS38 0014 DE67 INKEY -- MOS38 0015 DE67 8E B1 02 STX RDCTLO ;set INKEY counter -- MOS38 0016 DE6A 8C B2 02 STY RDCTHI -- MOS38 0017 DE6D A9 FF LDAIM &FF ;indicate INKEY operational -- MOS38 0018 DE6F D0 02 BNE RDCH5 ;[ALWAYS JUMP] MOS38 0018 DE6F v7D MOS38 0019 DE71 RDCH ;default OSRDCH MOS38 0018 DE6F v7D MOS38 0020 DE71 A9 00 LDAIM ZERO ;indicate not INKEY MOS38 0018 DE6F v7D MOS38 0021 DE73 RDCH5 MOS38 0018 DE6F v7D MOS38 0022 DE73 85 E6 STA RDCTEM -- MOS38 0023 DE75 ; save X and Y -- MOS38 0024 DE75 8A TXA -- MOS38 0025 DE76 48 PHA -- MOS38 0026 DE77 98 TYA -- MOS38 0027 DE78 48 PHA -- MOS38 0028 DE79 ; check for exec file -- MOS38 0029 DE79 AC 56 02 LDY EXECH -- MOS38 0030 DE7C F0 14 BEQ RDCHQ ;[no exec file] MOS38 0030 DE7C v6B MOS38 0031 DE7E ; MOS38 0030 DE7C v6B MOS38 0032 DE7E 38 SEC MOS38 0030 DE7C v6B MOS38 0033 DE7F 66 EB ROR ESSEMA ;enter critical region MOS38 0030 DE7C v6B MOS38 0034 DE81 20 D7 FF JSR OSBGET ;get a byte from exec file MOS38 0030 DE7C v6B MOS38 0035 DE84 08 PHP MOS38 0030 DE7C v6B MOS38 0036 DE85 46 EB LSR ESSEMA ;exit critical region MOS38 0030 DE7C v6B MOS38 0037 DE87 28 PLP MOS38 0030 DE7C v6B MOS38 0038 DE88 90 25 BCC RDCH3 ;[return character] MOS38 0038 DE88 v5A MOS38 0039 DE8A ; MOS38 0038 DE88 v5A MOS38 0040 DE8A ; end of exec file: close exec file MOS38 0038 DE88 v5A MOS38 0041 DE8A ; Y = handle MOS38 0038 DE88 v5A MOS38 0042 DE8A A9 00 LDAIM ZERO MOS38 0038 DE88 v5A MOS38 0043 DE8C 8D 56 02 STA EXECH ;cancel exec file handle MOS38 0038 DE88 v5A MOS38 0044 DE8F 20 CE FF JSR OSFIND ;close exec file MOS38 0038 DE88 v5A MOS38 0045 DE92 RDCHQ ;read character MOS38 0038 DE88 v5A MOS38 0046 DE92 24 FF BIT ESCFLG MOS38 0038 DE88 v5A MOS38 0047 DE94 30 16 BMI RDCH1 ;[ESCAPE detected] MOS38 0038 DE88 v5A MOS38 0048 DE96 ; MOS38 0038 DE88 v5A MOS38 0049 DE96 AE 41 02 LDX RDCHSW ;set to read ch from selected buffer MOS38 0038 DE88 v5A MOS38 0050 DE99 20 BA E5 JSR RDCHG ;get ch from kybd input buffer MOS38 0038 DE88 v5A MOS38 0051 DE9C 90 11 BCC RDCHN ;[character available] MOS38 0038 DE88 v5A MOS38 0052 DE9E ; MOS38 0038 DE88 v5A MOS38 0053 DE9E ; C=1 MOS38 0038 DE88 v5A MOS38 0054 DE9E ; MOS38 0038 DE88 v5A MOS38 0055 DE9E 24 E6 BIT RDCTEM MOS38 0038 DE88 v5A MOS38 0056 DEA0 50 F0 BVC RDCHQ ;[INKEY not operational] MOS38 0038 DE88 v5A MOS38 0057 DEA2 ; MOS38 0038 DE88 v5A MOS38 0058 DEA2 AD B1 02 LDA RDCTLO MOS38 0038 DE88 v5A MOS38 0059 DEA5 0D B2 02 ORA RDCTHI MOS38 0038 DE88 v5A MOS38 0060 DEA8 D0 E8 BNE RDCHQ ;[INKEY counter <> 0] MOS38 0038 DE88 v5A MOS38 0061 DEAA ; MOS38 0038 DE88 v5A MOS38 0062 DEAA ;INKEY count exhausted MOS38 0038 DE88 v5A MOS38 0063 DEAA ; MOS38 0038 DE88 v5A MOS38 0064 DEAA B0 05 BCS RDCH2 ;[ALWAYS jump, return A=$FF, C=1] MOS38 0038 DE88 v5A MOS38 0065 DEAC ; MOS38 0038 DE88 v5A MOS38 0066 DEAC RDCH1 ;ESCAPE detected MOS38 0038 DE88 v5A MOS38 0067 DEAC 38 SEC ;indicate escape detected MOS38 0038 DE88 v5A MOS38 0068 DEAD A9 1B LDAIM ESC MOS38 0038 DE88 v5A MOS38 0069 DEAF RDCHN ;C=0 => 'real' character MOS38 0038 DE88 v5A MOS38 0070 DEAF RDCH3 ;C=1 => escape detected OR INKEY count expired MOS38 0038 DE88 v5A MOS38 0071 DEAF 85 E6 STA RDCTEM ;save character read MOS38 0064 DEAA v7A MOS38 0072 DEB1 RDCH2 ;entry point used when INKEY count exhausted (N.B. RDCTEM=$FF) MOS38 0064 DEAA v7A MOS38 0073 DEB1 68 PLA ;restore X and Y -- MOS38 0074 DEB2 A8 TAY -- MOS38 0075 DEB3 68 PLA -- MOS38 0076 DEB4 AA TAX -- MOS38 0077 DEB5 A5 E6 LDA RDCTEM ;A := character -- MOS38 0078 DEB7 60 RTS -- MOS38 0079 DEB8 [ MOS125 = &FF -- MOS38 0355 DEB8 ] -- MOS38 0356 DEB8 -- MOS38 0357 DEB8 [ MOS125 = &FF -- MOS38 0358 DEB8 | -- MOS38 0359 DEB8 ;START OF MOS 1.25 -- MOS38 0360 DEB8 ; COPYR had been anchored here for fear that CLISKP -- MOS38 0361 DEB8 ; would be entered with X<2; this is now ruled out -- MOS38 0362 DEB8 ; but instead end-of-table marker must be within -- MOS38 0363 DEB8 ; 253 bytes of COMTAB -- MOS38 0364 DEB8 ; command level interpreter -- MOS38 0365 DEB8 COMTAB ;table of MOS commands -- MOS38 0366 DEB8 ; this table uses the fact that all routine address hi-bytes -- MOS38 0367 DEB8 ; will have the top bit set -- MOS38 0368 DEB8 ; N.B. addresses are stored hi-byte followed by lo-byte -- MOS38 0369 DEB8 ; hi-byte is assumed to be >=$80 -- MOS38 0370 DEB8 ; code following address is A reg on entry to address -- MOS38 0371 DEB8 ; A+ => enter with XY -> line -- MOS38 0372 DEB8 ; A- => enter with Y = offset -- MOS38 0373 DEB8 -- MOS38 0374 DEB8 ; CAT -- MOS38 0375 DEB8 ;must come first to trap *. -- MOS38 0376 DEB8 43 41 54 = "CAT" -- MOS38 0377 DEBB E0 8A & /JMIFSC -- MOS38 0378 DEBD 05 = FSCAT ;enter with XY -> line -- MOS38 0379 DEBE -- MOS38 0380 DEBE ; FX -- MOS38 0381 DEBE ;second entry in OS 1.20. -- MOS38 0382 DEBE ;some naughty code might rely on the same quick response -- MOS38 0383 DEBE ;but we also want to give fast access to USERV (*FX136) -- MOS38 0384 DEBE ;and match early due to the sheer volume of calls -- MOS38 0385 DEBE 46 58 = "FX" -- MOS38 0386 DEC0 E3 6C & /FX -- MOS38 0387 DEC2 FF = &FF ;enter with Y = offset -- MOS38 0388 DEC3 -- MOS38 0389 DEC3 ; CODE -- MOS38 0390 DEC3 ;match after FX to take less time than *FX136 -- MOS38 0391 DEC3 43 4F 44 = "CODE" -- MOS38 0392 DEC7 E3 72 & /FXN -- MOS38 0393 DEC9 88 = FXCODE ;enter with Y = offset -- MOS38 0394 DECA -- MOS38 0395 DECA ; LOAD -- MOS38 0396 DECA ;must come before LINE to trap *L. -- MOS38 0397 DECA 4C 4F 41 = "LOAD" -- MOS38 0398 DECE E2 98 & /LOAD -- MOS38 0399 DED0 MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 71 MOS38 MOS38 CLI MOS38 -- MOS38 0400 DED0 00 = &00 ;enter with XY -> line -- MOS38 0401 DED1 -- MOS38 0402 DED1 ; LINE -- MOS38 0403 DED1 ;needs fast service the most as user code may be time critical -- MOS38 0404 DED1 ;the only (trivial) way to pass a string from parasite to USERV -- MOS38 0405 DED1 4C 49 4E = "LINE" -- MOS38 0406 DED5 E6 9C & /JMIUSR -- MOS38 0407 DED7 01 = &01 ;enter with A=$01, XY -> line, C=0 -- MOS38 0408 DED8 -- MOS38 0409 DED8 ; default if first character is not alpha, |, . or / -- MOS38 0410 DED8 ;filter the wordless *commands off early -- MOS38 0411 DED8 ;a substitute for testing the first char in code -- MOS38 0412 DED8 [ MOS125 = &7F -- MOS38 0413 DED8 [ STARGO = &00 -- MOS38 0414 DED8 E0 83 & /JMICMD -- MOS38 0415 DEDA | -- MOS38 0417 DEDA ] -- MOS38 0418 DEDA | -- MOS38 0420 DEDA ] -- MOS38 0421 DEDA 03 = FSNAME ;enter with XY -> line -- MOS38 0422 DEDB -- MOS38 0423 DEDB ; RUN -- MOS38 0424 DEDB ;must come before ROM to trap *R. -- MOS38 0425 DEDB ;should be as fast as *wordless to avoid disadvantage -- MOS38 0426 DEDB 52 55 4E = "RUN" -- MOS38 0427 DEDE [ MOS125 = &7F -- MOS38 0428 DEDE [ STARGO = &00 -- MOS38 0429 DEDE E0 83 & /JMICMD -- MOS38 0430 DEE0 | -- MOS38 0432 DEE0 ] -- MOS38 0433 DEE0 | -- MOS38 0435 DEE0 ] -- MOS38 0436 DEE0 -- MOS38 0437 DEE0 04 = FSRUN ;enter with XY -> line -- MOS38 0438 DEE1 -- MOS38 0439 DEE1 ; OPT -- MOS38 0440 DEE1 ;part of a program's operation, has high priority -- MOS38 0441 DEE1 4F 50 54 = "OPT" -- MOS38 0442 DEE4 E3 72 & /FXN -- MOS38 0443 DEE6 -- MOS38 0444 DEE6 8B = FXOPT ;enter with Y = offset -- MOS38 0445 DEE7 -- MOS38 0446 DEE7 ; EXEC -- MOS38 0447 DEE7 ;slow but provides the computer with work, should not hold it up -- MOS38 0448 DEE7 45 58 45 = "EXEC" -- MOS38 0449 DEEB F6 BD & /EXEC -- MOS38 0450 DEED -- MOS38 0451 DEED 00 = ZERO ;enter with XY -> line -- MOS38 0452 DEEE -- MOS38 0453 DEEE ; MOTOR -- MOS38 0454 DEEE ;a quick command but not urgent coming through OSCLI -- MOS38 0455 DEEE 4D 4F 54 = "MOTOR" -- MOS38 0456 DEF3 E3 72 & /FXN -- MOS38 0457 DEF5 -- MOS38 0458 DEF5 89 = FXMOTR ;enter with Y = offset -- MOS38 0459 DEF6 -- MOS38 0460 DEF6 ; SAVE -- MOS38 0461 DEF6 ;must come before SPOOL to trap *S. -- MOS38 0462 DEF6 ;a slow command and rarer than loading -- MOS38 0463 DEF6 53 41 56 = "SAVE" -- MOS38 0464 DEFA E2 9A & /SAVE -- MOS38 0465 DEFC -- MOS38 0466 DEFC 00 = ZERO ;enter with XY -> line -- MOS38 0467 DEFD -- MOS38 0468 DEFD ; SPOOL -- MOS38 0469 DEFD ;also slow and rarer than saving -- MOS38 0470 DEFD 53 50 4F = "SPOOL" -- MOS38 0471 DF02 E2 DD & /SPOOL -- MOS38 0472 DF04 -- MOS38 0473 DF04 00 = ZERO ;enter with XY -> line -- MOS38 0474 DF05 -- MOS38 0475 DF05 ; KEY -- MOS38 0476 DF05 ;low volume, called by programs at setup -- MOS38 0477 DF05 4B 45 59 = "KEY" -- MOS38 0478 DF08 E3 A1 & /KEY -- MOS38 0479 DF0A -- MOS38 0480 DF0A FF = &FF ;enter with Y = offset -- MOS38 0481 DF0B -- MOS38 0482 DF0B ; TAPE -- MOS38 0483 DF0B ;must come before TV to trap *T. -- MOS38 0484 DF0B ;slightly more complex, called by programs at setup -- MOS38 0485 DF0B 54 41 50 = "TAPE" -- MOS38 0486 DF0F E3 72 & /FXN -- MOS38 0487 DF11 -- MOS38 0488 DF11 8C = FXTAPE ;enter with Y = offset -- MOS38 0489 DF12 -- MOS38 0490 DF12 ; TV -- MOS38 0491 DF12 ;cosmetic, called by programs at setup -- MOS38 0492 DF12 54 56 = "TV" -- MOS38 0493 DF14 E3 72 & /FXN -- MOS38 0494 DF16 -- MOS38 0495 DF16 90 = FXTV ;enter with Y = offset -- MOS38 0496 DF17 -- MOS38 0497 DF17 ; HELP -- MOS38 0498 DF17 ;user command -- MOS38 0499 DF17 48 45 4C = "HELP" -- MOS38 0500 DF1B F0 C5 & /HELP -- MOS38 0501 DF1D -- MOS38 0502 DF1D FF = &FF ;enter with Y = offset -- MOS38 0503 DF1E -- MOS38 0504 DF1E ; ROM -- MOS38 0505 DF1E ;rarely used. as RFS installations are site-specific -- MOS38 0506 DF1E ;this is essentially a user command -- MOS38 0507 DF1E 52 4F 4D = "ROM" -- MOS38 0508 DF21 E3 72 & /FXN -- MOS38 0509 DF23 -- MOS38 0510 DF23 8D = FXSROM ;don't care -- MOS38 0511 DF24 -- MOS38 0512 DF24 ; BASIC -- MOS38 0513 DF24 ;invokes the language (i.e. non-transient) -- MOS38 0514 DF24 ;called either by the user or in a slow *EXEC file -- MOS38 0515 DF24 42 41 53 = "BASIC" -- MOS38 0516 DF29 E0 68 & /BASIC -- MOS38 0517 DF2B 01 = &01 ;bit 0 set for ILR2 to enter ROM with C=1 -- MOS38 0518 DF2C ] -- MOS38 0519 DF2C -- MOS38 0520 DF2C [ MOS125 = &7F -- MOS38 0521 DF2C [ STARGO = &00 -- MOS38 0522 DF2C ; GOIO -- MOS38 0523 DF2C ;comes before GO to trap *G. -- MOS38 0524 DF2C 47 4F 49 = "GOIO" MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 72 MOS38 MOS38 CLI MOS38 -- MOS38 0525 DF30 DF 6F & /GOIO -- MOS38 0526 DF32 -- MOS38 0527 DF32 80 = /LANG ;assumed -ve; stored as default jump address -- MOS38 0528 DF33 -- MOS38 0529 DF33 ; GO -- MOS38 0530 DF33 47 4F = "GO" -- MOS38 0531 DF35 DF 70 & /GO -- MOS38 0532 DF37 -- MOS38 0533 DF37 80 = /LANG ;assumed -ve; stored as default jump address -- MOS38 0534 DF38 -- MOS38 0535 DF38 = "" ;terminating keyword [duplicate, NEVER matches] -- MOS38 0536 DF38 80 = &80 ;end of table -- MOS38 0537 DF39 -- MOS38 0538 DF39 00 00 00 % 54 ;padding -- MOS38 0539 DF6F -- MOS38 0540 DF6F [ NOSP = &00 -- MOS38 0542 DF6F ] -- MOS38 0543 DF6F -- MOS38 0544 DF6F GOIO -- MOS38 0545 DF6F 38 SEC -- MOS38 0546 DF70 GO -- MOS38 0547 DF70 08 PHP -- MOS38 0548 DF71 A2 D4 LDXIM INFO +BKEXEC -FBLOCK ;stretch! -- MOS38 0549 DF73 20 5F E2 JSR CLRFB -- MOS38 0550 DF76 8D C3 03 STA INFO +BKEXEC +&01 ;default address = &00008000 -- MOS38 0551 DF79 20 70 E2 JSR LSA ;replace with user address if present -- MOS38 0552 DF7C 28 PLP -- MOS38 0553 DF7D 90 08 BCC GETENV ;if *GO then use whole address MOS38 0553 DF7D v77 MOS38 0554 DF7F A9 FF LDAIM &FF MOS38 0553 DF7D v77 MOS38 0555 DF81 8D C4 03 STA INFO +BKEXEC +&02 MOS38 0553 DF7D v77 MOS38 0556 DF84 8D C5 03 STA INFO +BKEXEC +&03 ;else force an I/O processor address MOS38 0553 DF7D v77 MOS38 0557 DF87 GETENV MOS38 0553 DF7D v77 MOS38 0558 DF87 20 93 E0 JSR SKIPSP ;get next argument -- MOS38 0559 DF8A F0 07 BEQ GOTO ;if CR then point tail at it MOS38 0559 DF8A v78 MOS38 0560 DF8C C9 3B CMPIM ";" MOS38 0559 DF8A v78 MOS38 0561 DF8E D0 03 BNE GOTO ;if not semicolon then point tail at it MOS38 0559 DF8A v78 MOS38 0562 DF90 20 92 E0 JSR SKIPSN ;else absorb semicolon once MOS38 0559 DF8A v78 MOS38 0563 DF93 GOTO MOS38 0559 DF8A v78 MOS38 0564 DF93 4C 0A F3 JMP RUNGO ;set up tail from Y and enter user code -- MOS38 0565 DF96 -- MOS38 0566 DF96 RETAIL ;return command line tail to OSARGS control block -- MOS38 0567 DF96 ;Y=high byte -- MOS38 0568 DF96 94 01 STYZX &01 ;store in 3MSB -- MOS38 0569 DF98 AC D0 02 LDY TAILLO -- MOS38 0570 DF9B 94 00 STYZX &00 ;store low byte in MSB -- MOS38 0571 DF9D A0 FF LDYIM &FF ;command line tail is always in I/O processor -- MOS38 0572 DF9F 94 02 STYZX &02 ;set high word to &FFFF -- MOS38 0573 DFA1 94 03 STYZX &03 -- MOS38 0574 DFA3 C8 INY ;Y=0 for return -- MOS38 0575 DFA4 [ TRUE = &00 -- MOS38 0576 DFA4 A9 DC LDAIM SEAL ;set conventional return value (conflicting documentation) -- MOS38 0577 DFA6 ] -- MOS38 0578 DFA6 60 RTS -- MOS38 0579 DFA7 -- MOS38 0580 DFA7 COLHEX -- MOS38 0581 DFA7 [ FALSE = &00 -- MOS38 0584 DFA7 ] -- MOS38 0585 DFA7 AE C2 03 LDX INFO +BKEXEC ;get selected slot to X MOS38 0692 E015 ^10 MOS38 0586 DFAA E0 10 CPXIM NROM ;does the slot have a table entry? MOS38 0692 E015 ^10 MOS38 0587 DFAC [ TRUE = &00 MOS38 0692 E015 ^10 MOS38 0588 DFAC B0 70 BCS FRIEZE ;[not in table] MOS38 0588 DFAC v0F MOS38 0589 DFAE | MOS38 0588 DFAC v0F MOS38 0591 DFAE ] MOS38 0588 DFAC v0F MOS38 0592 DFAE BD A1 02 LDAAX ROMS MOS38 0588 DFAC v0F MOS38 0593 DFB1 10 6B BPL FRIEZE ;[not a service ROM] MOS38 0588 DFAC v0F MOS38 0594 DFB3 ABACUS MOS38 0588 DFAC v0F MOS38 0595 DFB3 A5 F4 LDA ROMID ;save current ROM MOS38 0588 DFAC v0F MOS38 0596 DFB5 48 PHA MOS38 0588 DFAC v0F MOS38 0597 DFB6 20 DB DB JSR STXROM MOS38 0588 DFAC v0F MOS38 0598 DFB9 A9 04 LDAIM SVNAME MOS38 0588 DFAC v0F MOS38 0599 DFBB 20 03 80 JSR ROMSFT ;call service ROM MOS38 0588 DFAC v0F MOS38 0600 DFBE AA TAX ;if ROM did not claim the call MOS38 0588 DFAC v0F MOS38 0601 DFBF D0 5D BNE FRIEZE ;then raise "Bad command" MOS38 0588 DFAC v0F MOS38 0602 DFC1 4C 90 F1 JMP SVOP3 ;[service claimed, do not offer to other ROMs] MOS38 0588 DFAC v0F MOS38 0603 DFC4 | MOS38 0588 DFAC v0F MOS38 0612 DFC4 ] MOS38 0588 DFAC v0F MOS38 0613 DFC4 ] MOS38 0588 DFAC v0F MOS38 0614 DFC4 MOS38 0588 DFAC v0F MOS38 0615 DFC4 [ MOS125 = &00 MOS38 0588 DFAC v0F MOS38 0624 DFC4 ] MOS38 0588 DFAC v0F MOS38 0625 DFC4 MOS38 0588 DFAC v0F MOS38 0626 DFC4 [ MOS125 = &FF MOS38 0588 DFAC v0F MOS38 0627 DFC4 | MOS38 0588 DFAC v0F MOS38 0628 DFC4 CLINT MOS38 0588 DFAC v0F MOS38 0629 DFC4 86 F2 STX WORK +&00 MOS38 0588 DFAC v0F MOS38 0630 DFC6 84 F3 STY WORK +&01 MOS38 0588 DFAC v0F MOS38 0631 DFC8 ; report *command to filing system MOS38 0588 DFAC v0F MOS38 0632 DFC8 A9 08 LDAIM FSCLI MOS38 0588 DFAC v0F MOS38 0633 DFCA 20 8A E0 JSR JMIFSC MOS38 0588 DFAC v0F MOS38 0634 DFCD ; check line is terminated by CR MOS38 0588 DFAC v0F MOS38 0635 DFCD A0 00 LDYIM ZERO MOS38 0588 DFAC v0F MOS38 0636 DFCF A9 0D LDAIM MCR MOS38 0588 DFAC v0F MOS38 0637 DFD1 D1 F2 CLICHK CMPIY WORK MOS38 0588 DFAC v0F MOS38 0638 DFD3 F0 04 BEQ CLILOK ;[terminator present] MOS38 0588 DFAC v0F MOS38 0639 DFD5 C8 INY MOS38 0588 DFAC v0F MOS38 0640 DFD6 D0 F9 BNE CLICHK MOS38 0588 DFAC v0F MOS38 0641 DFD8 ; no terminator within 256 bytes so ignore line MOS38 0588 DFAC v0F MOS38 0642 DFD8 CLIRTS MOS38 0588 DFAC v0F MOS38 0643 DFD8 60 RTS MOS38 0588 DFAC v0F MOS38 0644 DFD9 ; MOS38 0588 DFAC v0F MOS38 0645 DFD9 A0 FF CLILOK LDYIM &FF ;start scan from beginning of input buffer MOS38 0588 DFAC v0F MOS38 0646 DFDB ; N.B. Y will now be incremented to ZERO by SKIPSN MOS38 0588 DFAC v0F MOS38 0647 DFDB CLIR ;skip leading spaces and asterisks MOS38 0588 DFAC v0F MOS38 0648 DFDB 20 92 E0 JSR SKIPSN ;skip spaces/asterisk and spaces MOS38 0588 DFAC v0F MOS38 0649 DFDE F0 F8 BEQ CLIRTS ;[reached end-of-line, ignore line] MOS38 0588 DFAC v0F MOS38 0650 DFE0 C9 2A CMPIM SPLAT MOS38 0588 DFAC v0F MOS38 0651 DFE2 F0 F7 BEQ CLIR ;[asterisk, ignore] MOS38 0588 DFAC v0F MOS38 0652 DFE4 [ FALSE=0 MOS38 0588 DFAC v0F MOS38 0656 DFE4 ] MOS38 0588 DFAC v0F MOS38 0657 DFE4 ; ignore comment line MOS38 0588 DFAC v0F MOS38 0658 DFE4 C9 7C CMPIM "|" MOS38 0588 DFAC v0F MOS38 0659 DFE6 F0 F0 BEQ CLIRTS ;[*| command] MOS38 0588 DFAC v0F MOS38 0660 DFE8 ; check for override MOS38 0588 DFAC v0F MOS38 0661 DFE8 C9 2F CMPIM "/" MOS38 0588 DFAC v0F MOS38 0662 DFEA D0 09 BNE NOTSL ;[not /] MOS38 0588 DFAC v0F MOS38 0663 DFEC ; */name MOS38 0588 DFAC v0F MOS38 0664 DFEC C8 INY ;skip past / MOS38 0588 DFAC v0F MOS38 0665 DFED 20 59 E0 JSR CLIXY ;make XY -> after / MOS38 0588 DFAC v0F MOS38 0666 DFF0 A9 02 LDAIM FSNOTA MOS38 0588 DFAC v0F MOS38 0667 DFF2 [ MOS125 = &7F MOS38 0588 DFAC v0F MOS38 0668 DFF2 [ STARGO = &00 MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 73 MOS38 MOS38 CLI MOS38 MOS38 0588 DFAC v0F MOS38 0669 DFF2 4C 83 E0 JMP JMICMD ;[ALWAYS JUMP] MOS38 0588 DFAC v0F MOS38 0670 DFF5 NOTSL MOS38 0588 DFAC v0F MOS38 0671 DFF5 ; save pointer to rest of line MOS38 0588 DFAC v0F MOS38 0672 DFF5 84 E6 STY CLIRY MOS38 0588 DFAC v0F MOS38 0673 DFF7 C9 3A CMPIM ":" MOS38 0588 DFAC v0F MOS38 0674 DFF9 D0 26 BNE NOTCO MOS38 0588 DFAC v0F MOS38 0675 DFFB C8 INY ;skip past colon MOS38 0588 DFAC v0F MOS38 0676 DFFC [ TRUE = &00 MOS38 0588 DFAC v0F MOS38 0677 DFFC D1 F2 CMPIY WORK ;is there a second colon? MOS38 0588 DFAC v0F MOS38 0678 DFFE D0 21 BNE NOTCO ;reject if not MOS38 0588 DFAC v0F MOS38 0679 E000 C8 INY ;skip past colon MOS38 0588 DFAC v0F MOS38 0680 E001 ] MOS38 0588 DFAC v0F MOS38 0681 E001 D1 F2 CMPIY WORK ;three colons? MOS38 0588 DFAC v0F MOS38 0682 E003 D0 06 BNE COLON ;if not then get hex MOS38 0588 DFAC v0F MOS38 0683 E005 20 92 E0 JSR SKIPSN ;else skip colon and spaces MOS38 0588 DFAC v0F MOS38 0684 E008 98 TYA ;command line offset to A MOS38 0588 DFAC v0F MOS38 0685 E009 D0 73 BNE CLIFS ;pass rest of line via FSC 3 (always) MOS38 0685 E009 v0C MOS38 0686 E00B COLON MOS38 0685 E009 v0C MOS38 0687 E00B A2 D4 LDXIM INFO +BKEXEC -FBLOCK ;hopefully out of the way MOS38 0685 E009 v0C MOS38 0688 E00D 20 70 E2 JSR LSA ;hex to scratch space MOS38 0685 E009 v0C MOS38 0689 E010 08 PHP ;save result MOS38 0685 E009 v0C MOS38 0690 E011 20 93 E0 JSR SKIPSP MOS38 0685 E009 v0C MOS38 0691 E014 28 PLP MOS38 0685 E009 v0C MOS38 0692 E015 B0 90 BCS COLHEX ;if hex present, call specific ROM MOS38 0685 E009 v0C MOS38 0693 E017 A2 04 LDXIM SVNAME ;else pass to service ROMs only MOS38 0685 E009 v0C MOS38 0694 E019 20 74 F1 JSR SVOP MOS38 0685 E009 v0C MOS38 0695 E01C F0 49 BEQ SVACK MOS38 0685 E009 v0C MOS38 0696 E01E FRIEZE MOS38 0685 E009 v0C MOS38 0697 E01E 4C 55 E3 JMP MBDCMD MOS38 0685 E009 v0C MOS38 0698 E021 NOTCO MOS38 0685 E009 v0C MOS38 0699 E021 | MOS38 0685 E009 v0C MOS38 0704 E021 ] MOS38 0685 E009 v0C MOS38 0705 E021 | MOS38 0685 E009 v0C MOS38 0710 E021 ] MOS38 0685 E009 v0C MOS38 0711 E021 ; X=&FF going to 0, point to start of table MOS38 0685 E009 v0C MOS38 0712 E021 A2 FF LDXIM &FF MOS38 0685 E009 v0C MOS38 0713 E023 CLIRST ; restart search at next keyword MOS38 0685 E009 v0C MOS38 0714 E023 A4 E6 LDY CLIRY ; reset pointer to start of user word MOS38 0685 E009 v0C MOS38 0715 E025 88 DEY ;cancel first INY MOS38 0685 E009 v0C MOS38 0716 E026 CLIADV ; compare characters MOS38 0685 E009 v0C MOS38 0717 E026 C8 INY ; advance user word pointer MOS38 0685 E009 v0C MOS38 0718 E027 B1 F2 LDAIY WORK ; fetch user character MOS38 0685 E009 v0C MOS38 0719 E029 20 27 E5 JSR CAPS ; set C=1 iff alpha [not iff caps] MOS38 0685 E009 v0C MOS38 0720 E02C 29 5F ANDIM &5F ; equate cases and also clear bit 7 MOS38 0685 E009 v0C MOS38 0721 E02E E8 INX ; advance table pointer or skip aux byte MOS38 0685 E009 v0C MOS38 0722 E02F 5D B8 DE EORAX COMTAB ; set b7 from table and compare b6..0 MOS38 0685 E009 v0C MOS38 0723 E032 ;N Z C meaning action may test/absorb "." MOS38 0685 E009 v0C MOS38 0724 E032 ;0 0 0 mismatch skip y (won't find ".") MOS38 0685 E009 v0C MOS38 0725 E032 ;0 0 1 end of user word/abbr. skip/accept y MOS38 0685 E009 v0C MOS38 0726 E032 ;0 1 0 characters match advance n MOS38 0685 E009 v0C MOS38 0727 E032 ;0 1 1 impossible - - MOS38 0685 E009 v0C MOS38 0728 E032 ;1 0 0 end of keyword skip n MOS38 0685 E009 v0C MOS38 0729 E032 ;1 0 1 end of both words accept n MOS38 0685 E009 v0C MOS38 0730 E032 F0 F2 BEQ CLIADV ; if Z=1 then characters match, advance MOS38 0685 E009 v0C MOS38 0731 E034 ;x 0 x MOS38 0685 E009 v0C MOS38 0732 E034 CLIFIN MOS38 0685 E009 v0C MOS38 0733 E034 30 07 BMI CLISKP ; if N=1 then skip or set up X and accept MOS38 0685 E009 v0C MOS38 0734 E036 ;0 0 x MOS38 0685 E009 v0C MOS38 0735 E036 B1 F2 LDAIY WORK ; restore user character MOS38 0685 E009 v0C MOS38 0736 E038 C8 INY ; advance pointer past dot MOS38 0685 E009 v0C MOS38 0737 E039 49 D1 EORIM ".":EOR:&FF ; if it was ".", now A=&FF MOS38 0685 E009 v0C MOS38 0738 E03B C9 FF CMPIM &FF ; C=0 if mismatch, skip; C=1 if abbreviation, accept MOS38 0685 E009 v0C MOS38 0739 E03D CLISKP MOS38 0685 E009 v0C MOS38 0740 E03D ;x 0 x MOS38 0685 E009 v0C MOS38 0741 E03D E8 INX ; skip high byte of action address MOS38 0685 E009 v0C MOS38 0742 E03E CLIALI ; align to keyword terminator MOS38 0685 E009 v0C MOS38 0743 E03E E8 INX ; advance table pointer or skip low byte of action address MOS38 0685 E009 v0C MOS38 0744 E03F BD B6 DE LDAAX COMTAB -&02 ; test table byte at original offset MOS38 0685 E009 v0C MOS38 0745 E042 10 FA BPL CLIALI ;[not reached address hi-byte] MOS38 0685 E009 v0C MOS38 0746 E044 90 2A BCC CLITMN ;if C=0, command rejected; test high byte MOS38 0685 E009 v0C MOS38 0747 E046 ;must go to CLITMN at the terminator! MOS38 0685 E009 v0C MOS38 0748 E046 ;terminator's keyword must NEVER match [i.e. it must be a duplicate] MOS38 0685 E009 v0C MOS38 0749 E046 ;CLIMFN ;full name match MOS38 0685 E009 v0C MOS38 0750 E046 ; found CLI command match MOS38 0685 E009 v0C MOS38 0751 E046 ; construct JMI hi-byte value to command processing code MOS38 0685 E009 v0C MOS38 0752 E046 48 PHA MOS38 0685 E009 v0C MOS38 0753 E047 ; construct JMI lo-byte value to command processing code MOS38 0685 E009 v0C MOS38 0754 E047 BD B7 DE LDAAX COMTAB -&01 MOS38 0685 E009 v0C MOS38 0755 E04A 48 PHA MOS38 0685 E009 v0C MOS38 0756 E04B ; skip spaces after command name MOS38 0685 E009 v0C MOS38 0757 E04B 20 93 E0 JSR SKIPSP MOS38 0685 E009 v0C MOS38 0758 E04E 18 CLC ;C=0 used by FXN entry MOS38 0685 E009 v0C MOS38 0759 E04F 08 PHP ;status used by EXEC and SPOOL MOS38 0685 E009 v0C MOS38 0760 E050 ; (optionally) make XY -> rest of line MOS38 0685 E009 v0C MOS38 0761 E050 20 54 E0 JSR CLIXYA MOS38 0685 E009 v0C MOS38 0762 E053 40 RTI ;enter command processing routine MOS38 0685 E009 v0C MOS38 0763 E054 MOS38 0685 E009 v0C MOS38 0764 E054 MOS38 0685 E009 v0C MOS38 0765 E054 CLIXYA ;conditionally make XY -> rest of line MOS38 0685 E009 v0C MOS38 0766 E054 BD B8 DE LDAAX COMTAB MOS38 0685 E009 v0C MOS38 0767 E057 30 0E BMI CLIXY0 ;[keep Y = offset of rest of line from WORK] MOS38 0685 E009 v0C MOS38 0768 E059 CLIXY ;make XY -> rest of command line MOS38 0685 E009 v0C MOS38 0769 E059 98 TYA ;A = offset of rest of line MOS38 0685 E009 v0C MOS38 0770 E05A BC B8 DE LDYAX COMTAB ;Y := function code MOS38 0685 E009 v0C MOS38 0771 E05D CLIXY2 MOS38 0685 E009 v0C MOS38 0772 E05D 18 CLC MOS38 0685 E009 v0C MOS38 0773 E05E 65 F2 ADC WORK ;N.B. C=1 => carry MOS38 0685 E009 v0C MOS38 0774 E060 AA TAX ;X = lo-byte of pointer to rest of line MOS38 0685 E009 v0C MOS38 0775 E061 98 TYA ;A = function code MOS38 0685 E009 v0C MOS38 0776 E062 A4 F3 LDY WORK +&01 MOS38 0685 E009 v0C MOS38 0777 E064 90 01 BCC CLIXY1 ;[no carry] MOS38 0685 E009 v0C MOS38 0778 E066 ; carry MOS38 0685 E009 v0C MOS38 0779 E066 C8 INY MOS38 0685 E009 v0C MOS38 0780 E067 CLIXY1 ;N.B. Y = hi-byte of pointer to rest of line MOS38 0685 E009 v0C MOS38 0781 E067 CLIXY0 MOS38 0685 E009 v0C MOS38 0782 E067 SVACK ;command accepted by service ROM MOS38 0685 E009 v0C MOS38 0783 E067 60 RTS MOS38 0685 E009 v0C MOS38 0784 E068 MOS38 0685 E009 v0C MOS38 0785 E068 MOS38 0685 E009 v0C MOS38 0786 E068 BASIC ;select BASIC language ROM MOS38 0685 E009 v0C MOS38 0787 E068 AE 4B 02 LDX BROMID MOS38 0685 E009 v0C MOS38 0788 E06B 30 06 BMI NBASIC ;[no BASIC ROM] MOS38 0685 E009 v0C MOS38 0789 E06D 4C A9 DB JMP ILR2 ;enter BASIC ROM (N.B. A b0=1, enter with C=1) MOS38 0685 E009 v0C MOS38 0790 E070 MOS38 0685 E009 v0C MOS38 0791 E070 CLITMN ;keyword rejected, action address reached MOS38 0685 E009 v0C MOS38 0792 E070 0A ASLA ;test bits 14..8 MOS38 0685 E009 v0C MOS38 0793 E071 D0 B0 BNE CLIRST ;if high byte was >&80, compare with next keyword MOS38 0685 E009 v0C MOS38 0794 E073 ;else &80 = command table terminator, fall through to CLIEND MOS38 0685 E009 v0C MOS38 0795 E073 MOS38 0685 E009 v0C MOS38 0796 E073 ;END OF MOS 1.25 MOS38 0685 E009 v0C MOS38 0797 E073 ] MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 74 MOS38 MOS38 CLI MOS38 MOS38 0685 E009 v0C MOS38 0798 E073 MOS38 0685 E009 v0C MOS38 0799 E073 LNK MOS39 MOS38 0685 E009 v0C MOS39 0001 E073 ; > MOS39 MOS38 0685 E009 v0C MOS39 0002 E073 TTL MOS39 CLI MOS38 0685 E009 v0C MOS39 0003 E073 OPT MOS39 MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 75 MOS39 MOS39 CLI MOS39 MOS38 0685 E009 v0C MOS39 0004 E073 ;(c) 1981 ACORN MOS38 0685 E009 v0C MOS39 0005 E073 ;BBC MOS MOS38 0685 E009 v0C MOS39 0006 E073 ;Change record: MOS38 0685 E009 v0C MOS39 0007 E073 ;004 29-Jul-81 MP Prototype version MOS38 0685 E009 v0C MOS39 0008 E073 ;Author(s): MOS38 0685 E009 v0C MOS39 0009 E073 ;PB Paul Bond MOS38 0685 E009 v0C MOS39 0010 E073 ;MP Mike Prees MOS38 0685 E009 v0C MOS39 0011 E073 MOS38 0685 E009 v0C MOS39 0012 E073 MOS38 0685 E009 v0C MOS39 0013 E073 NBASIC ;BASIC ROM not present so offer to service ROMs MOS38 0685 E009 v0C MOS39 0014 E073 CLIEND ;entered here if command not recognised or does not exist MOS38 0685 E009 v0C MOS39 0015 E073 ; offer command to service ROMs MOS38 0685 E009 v0C MOS39 0016 E073 A4 E6 LDY CLIRY ;restore Y offset to point to command name MOS38 0685 E009 v0C MOS39 0017 E075 A2 04 LDXIM SVNAME MOS38 0685 E009 v0C MOS39 0018 E077 20 74 F1 JSR SVOP MOS38 0685 E009 v0C MOS39 0019 E07A F0 EB BEQ SVACK ;[accepted by service ROM] MOS38 0685 E009 v0C MOS39 0020 E07C ; command not accepted by a service ROM MOS38 0685 E009 v0C MOS39 0021 E07C ; so pass command to filing system MOS38 0685 E009 v0C MOS39 0022 E07C A5 E6 LDA CLIRY ;A = offset to command name MOS38 0685 E009 v0C MOS39 0023 E07E [ MOS125 = &7F MOS38 0685 E009 v0C MOS39 0024 E07E [ STARGO = &00 MOS38 0685 E009 v0C MOS39 0025 E07E CLIFS MOS38 0685 E009 v0C MOS39 0026 E07E ] MOS38 0685 E009 v0C MOS39 0027 E07E ] MOS38 0685 E009 v0C MOS39 0028 E07E 20 5D E0 JSR CLIXY2 ;make XY -> rest of line -- MOS39 0029 E081 A9 03 LDAIM FSNAME -- MOS39 0030 E083 [ MOS125 = &7F -- MOS39 0031 E083 [ STARGO = &00 -- MOS39 0032 E083 JMICMD -- MOS39 0033 E083 ;entry for FSC calls 2,3,4,(11) -- MOS39 0034 E083 ;cancel OSARGS 1 intercept, FS provides the tail pointer itself -- MOS39 0035 E083 48 PHA -- MOS39 0036 E084 A9 00 LDAIM &00 -- MOS39 0037 E086 8D D1 02 STA TAILHI -- MOS39 0038 E089 68 PLA -- MOS39 0039 E08A ] -- MOS39 0040 E08A ] -- MOS39 0041 E08A -- MOS39 0042 E08A JMIFSC -- MOS39 0043 E08A -- MOS39 0044 E08A 6C 1E 02 JMI FSCVEC MOS39 0052 E090 ^78 MOS39 0045 E08D ; MOS39 0052 E090 ^78 MOS39 0046 E08D ; MOS39 0052 E090 ^78 MOS39 0047 E08D OPT MOS39 0052 E090 ^78 MOS39 0048 E08D 0A ASLA ;lsb(A) := 0 MOS39 0052 E090 ^78 MOS39 0049 E08E ;* LDAIM $00 MOS39 0052 E090 ^78 MOS39 0050 E08E EOF MOS39 0052 E090 ^78 MOS39 0051 E08E 29 01 ANDIM &01 ;$00 => OPT, $01 => EOF MOS39 0052 E090 ^78 MOS39 0052 E090 10 F8 BPL JMIFSC ;[ALWAYS JUMP, present option to file system AND return] -- MOS39 0053 E092 -- MOS39 0054 E092 -- MOS39 0055 E092 ; ignore space characters -- MOS39 0056 E092 C8 SKIPSN INY ;skip current character MOS39 0059 E097 ^79 MOS39 0057 E093 B1 F2 SKIPSP LDAIY WORK MOS39 0066 E09C ^75 MOS39 0058 E095 C9 20 CMPIM SPACE MOS39 0066 E09C ^75 MOS39 0059 E097 F0 F9 BEQ SKIPSN ;[character is space, ignore] MOS39 0066 E09C ^75 MOS39 0060 E099 C9 0D SKPSP1 CMPIM MCR MOS39 0071 E0A3 ^74 MOS39 0061 E09B ; Z=1 next character is CR MOS39 0071 E0A3 ^74 MOS39 0062 E09B ; Z=0 next character is not CR MOS39 0071 E0A3 ^74 MOS39 0063 E09B 60 RTS MOS39 0071 E0A3 ^74 MOS39 0064 E09C SKPCM ;C=0 => check for line end MOS39 0071 E0A3 ^74 MOS39 0065 E09C ;C=1 => skip optional comma and check for line end MOS39 0071 E0A3 ^74 MOS39 0066 E09C 90 F5 BCC SKIPSP MOS39 0071 E0A3 ^74 MOS39 0067 E09E SKPCOM MOS39 0071 E0A3 ^74 MOS39 0068 E09E ; skip spaces and an optional comma MOS39 0071 E0A3 ^74 MOS39 0069 E09E 20 93 E0 JSR SKIPSP MOS39 0071 E0A3 ^74 MOS39 0070 E0A1 C9 2C CMPIM "," MOS39 0071 E0A3 ^74 MOS39 0071 E0A3 D0 F4 BNE SKPSP1 -- MOS39 0072 E0A5 C8 INY ;N.B. force Z=0 (i.e. non-zero result) -- MOS39 0073 E0A6 60 RTS -- MOS39 0074 E0A7 ; get decimal number -- MOS39 0075 E0A7 [ MOS125 = &FF -- MOS39 0108 E0A7 | -- MOS39 0109 E0A7 GETNUM -- MOS39 0110 E0A7 20 93 E0 JSR SKIPSP ;skip leading spaces, A := delimiter -- MOS39 0111 E0AA 20 CF E0 JSR TSTNUM -- MOS39 0112 E0AD B0 13 BCS GN0 MOS39 0112 E0AD v6C MOS39 0113 E0AF 60 RTS ;C=0 [not a digit] MOS39 0112 E0AD v6C MOS39 0114 E0B0 MOS39 0112 E0AD v6C MOS39 0115 E0B0 GNT MOS39 0112 E0AD v6C MOS39 0116 E0B0 E0 1A CPXIM &1A ;if 26 or more MOS39 0132 E0C8 ^66 MOS39 0117 E0B2 B0 2B BCS TSTNR ;then overflow MOS39 0117 E0B2 v54 MOS39 0118 E0B4 AA TAX ;save last digit read MOS39 0117 E0B2 v54 MOS39 0119 E0B5 A5 E6 LDA NUMBER MOS39 0117 E0B2 v54 MOS39 0120 E0B7 0A ASLA ;times 2 MOS39 0117 E0B2 v54 MOS39 0121 E0B8 0A ASLA ;times 4 MOS39 0117 E0B2 v54 MOS39 0122 E0B9 65 E6 ADC NUMBER ;times 5; C=0 MOS39 0117 E0B2 v54 MOS39 0123 E0BB 0A ASLA ;times 10; C=0 MOS39 0117 E0B2 v54 MOS39 0124 E0BC 86 E6 STX NUMBER ;NUMBER := most recently read digit MOS39 0117 E0B2 v54 MOS39 0125 E0BE ; N.B. C=0 MOS39 0117 E0B2 v54 MOS39 0126 E0BE 65 E6 ADC NUMBER ;A := accumulated value MOS39 0117 E0B2 v54 MOS39 0127 E0C0 B0 1D BCS TSTNR ;[overflow] MOS39 0117 E0B2 v54 MOS39 0128 E0C2 GN0 MOS39 0117 E0B2 v54 MOS39 0129 E0C2 85 E6 STA NUMBER ;NUMBER := accumulated number so far (must save for KEY) MOS39 0117 E0B2 v54 MOS39 0130 E0C4 AA TAX MOS39 0117 E0B2 v54 MOS39 0131 E0C5 20 CE E0 JSR TSTNUX ;read digit skipping current character MOS39 0117 E0B2 v54 MOS39 0132 E0C8 B0 E6 BCS GNT ;process digit [non-digit serves as terminator] MOS39 0117 E0B2 v54 MOS39 0133 E0CA C9 0D CMPIM MCR MOS39 0117 E0B2 v54 MOS39 0134 E0CC 38 SEC MOS39 0117 E0B2 v54 MOS39 0135 E0CD ; return with: MOS39 0117 E0B2 v54 MOS39 0136 E0CD ; C=1 => valid number, Z=1/0 => delimiter is/is_not CR, number in X MOS39 0117 E0B2 v54 MOS39 0137 E0CD 60 RTS MOS39 0117 E0B2 v54 MOS39 0138 E0CE ] MOS39 0117 E0B2 v54 MOS39 0139 E0CE MOS39 0117 E0B2 v54 MOS39 0140 E0CE ; check character is a digit MOS39 0117 E0B2 v54 MOS39 0141 E0CE TSTNUX MOS39 0117 E0B2 v54 MOS39 0142 E0CE C8 INY ;skip current character MOS39 0117 E0B2 v54 MOS39 0143 E0CF TSTNUM MOS39 0117 E0B2 v54 MOS39 0144 E0CF B1 F2 LDAIY WORK ;get next character MOS39 0117 E0B2 v54 MOS39 0145 E0D1 C9 3A CMPIM &3A ;N.B. $3A = '9' + 1 MOS39 0117 E0B2 v54 MOS39 0146 E0D3 B0 0A BCS TSTNR ;[bad digit, > '9'] MOS39 0117 E0B2 v54 MOS39 0147 E0D5 C9 30 CMPIM "0" MOS39 0117 E0B2 v54 MOS39 0148 E0D7 90 06 BCC TSTNR ;[bad digit, < '0'] MOS39 0117 E0B2 v54 MOS39 0149 E0D9 29 0F ANDIM &0F ;convert to number (do not corrupt V) MOS39 0117 E0B2 v54 MOS39 0150 E0DB ; N.B. C=1 MOS39 0117 E0B2 v54 MOS39 0151 E0DB 60 RTS MOS39 0117 E0B2 v54 MOS39 0152 E0DC MOS39 0117 E0B2 v54 MOS39 0153 E0DC TSTNRX MOS39 0117 E0B2 v54 MOS39 0154 E0DC 20 9E E0 JSR SKPCOM MOS39 0117 E0B2 v54 MOS39 0155 E0DF TSTNR MOS39 0117 E0B2 v54 MOS39 0156 E0DF 18 CLC MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 76 MOS39 MOS39 CLI MOS39 MOS39 0167 E0EE ^6C MOS39 0157 E0E0 ; C=0 bad number, A = delimiting character MOS39 0167 E0EE ^6C MOS39 0158 E0E0 60 RTS MOS39 0167 E0EE ^6C MOS39 0159 E0E1 MOS39 0167 E0EE ^6C MOS39 0160 E0E1 TSTHEX ;test for, and convert, hex digit MOS39 0167 E0EE ^6C MOS39 0161 E0E1 20 CF E0 JSR TSTNUM MOS39 0167 E0EE ^6C MOS39 0162 E0E4 B0 0E BCS TSTH0 ;[is a number, therefore a valid hex digit] MOS39 0167 E0EE ^6C MOS39 0163 E0E6 29 DF ANDIM &DF ;force upper case MOS39 0167 E0EE ^6C MOS39 0164 E0E8 C9 47 CMPIM "G" MOS39 0167 E0EE ^6C MOS39 0165 E0EA B0 F0 BCS TSTNRX ;[>'F' so fail] MOS39 0167 E0EE ^6C MOS39 0166 E0EC C9 41 CMPIM "A" MOS39 0167 E0EE ^6C MOS39 0167 E0EE 90 EC BCC TSTNRX ;[<'A' so fail] MOS39 0162 E0E4 v71 MOS39 0168 E0F0 08 PHP ;save V MOS39 0162 E0E4 v71 MOS39 0169 E0F1 E9 37 SBCIM ALPHAA -&0A ;convert to hex MOS39 0162 E0E4 v71 MOS39 0170 E0F3 28 PLP ;restore V MOS39 0162 E0E4 v71 MOS39 0171 E0F4 ; C=1 MOS39 0162 E0E4 v71 MOS39 0172 E0F4 TSTH0 ;C=1 MOS39 0162 E0E4 v71 MOS39 0173 E0F4 C8 INY -- MOS39 0174 E0F5 60 RTS -- MOS39 0175 E0F6 -- MOS39 0176 E0F6 -- MOS39 0177 E0F6 WRCH ;system write character -- MOS39 0178 E0F6 48 PHA ;save character on stack -- MOS39 0179 E0F7 8A TXA ;save registers -- MOS39 0180 E0F8 48 PHA -- MOS39 0181 E0F9 98 TYA -- MOS39 0182 E0FA 48 PHA -- MOS39 0183 E0FB BA TSX -- MOS39 0184 E0FC BD 03 01 LDAAX &0103 ;restore character -- MOS39 0185 E0FF 48 PHA -- MOS39 0186 E100 ; A = character -- MOS39 0187 E100 -- MOS39 0188 E100 ; examine WRCH selection(s) -- MOS39 0189 E100 ; -- MOS39 0190 E100 2C 60 02 BIT NETWRC -- MOS39 0191 E103 10 08 BPL WRCNTN ;[WRCH not to net] MOS39 0191 E103 v77 MOS39 0192 E105 ; WRCH to net MOS39 0191 E103 v77 MOS39 0193 E105 ; A = character MOS39 0191 E103 v77 MOS39 0194 E105 A8 TAY ;send character in Y MOS39 0191 E103 v77 MOS39 0195 E106 A9 04 LDAIM NTWRCH MOS39 0191 E103 v77 MOS39 0196 E108 20 C1 E5 JSR JMINET ;WRCH thru net MOS39 0191 E103 v77 MOS39 0197 E10B B0 52 BCS WRCHNN ;[immediate return to caller] MOS39 0197 E10B v2D MOS39 0198 E10D ; MOS39 0197 E10B v2D MOS39 0199 E10D ; continue within WRCH MOS39 0197 E10B v2D MOS39 0200 E10D ; MOS39 0197 E10B v2D MOS39 0201 E10D WRCNTN MOS39 0197 E10B v2D MOS39 0202 E10D MOS39 0197 E10B v2D MOS39 0203 E10D 18 CLC ;in case VDU not selected MOS39 0197 E10B v2D MOS39 0204 E10E A9 02 LDAIM WRVDU MOS39 0197 E10B v2D MOS39 0205 E110 2C 7C 02 BIT WRCHSW MOS39 0197 E10B v2D MOS39 0206 E113 D0 05 BNE WRCHNV ;[WRCH not to VDU] MOS39 0197 E10B v2D MOS39 0207 E115 ; WRCH to VDU MOS39 0197 E10B v2D MOS39 0208 E115 68 PLA MOS39 0197 E10B v2D MOS39 0209 E116 48 PHA ;A := character MOS39 0197 E10B v2D MOS39 0210 E117 20 C0 C4 JSR VDU MOS39 0197 E10B v2D MOS39 0211 E11A ; C=0 => VDU says do not print character MOS39 0197 E10B v2D MOS39 0212 E11A WRCHNV ;WRCH not to VDU MOS39 0197 E10B v2D MOS39 0213 E11A MOS39 0197 E10B v2D MOS39 0214 E11A ; C=0 => VDU (if selected) says do not print character MOS39 0197 E10B v2D MOS39 0215 E11A ; check who controls printing MOS39 0197 E10B v2D MOS39 0216 E11A A9 08 LDAIM WRPRNT MOS39 0197 E10B v2D MOS39 0217 E11C 2C 7C 02 BIT WRCHSW MOS39 0197 E10B v2D MOS39 0218 E11F D0 02 BNE WRCHNC ;[printing not controlled by VDU] MOS39 0197 E10B v2D MOS39 0219 E121 ; printing controlled by VDU MOS39 0197 E10B v2D MOS39 0220 E121 90 05 BCC WRCHNP ;[VDU says do not print character] MOS39 0197 E10B v2D MOS39 0221 E123 WRCHNC ;conditionally print character MOS39 0197 E10B v2D MOS39 0222 E123 68 PLA MOS39 0197 E10B v2D MOS39 0223 E124 48 PHA ;A := character MOS39 0197 E10B v2D MOS39 0224 E125 20 66 E1 JSR MPRINT ;conditionally print character MOS39 0197 E10B v2D MOS39 0225 E128 WRCHNP ;do not print character MOS39 0197 E10B v2D MOS39 0226 E128 MOS39 0197 E10B v2D MOS39 0227 E128 ; check for output to RS423 MOS39 0197 E10B v2D MOS39 0228 E128 ; MOS39 0197 E10B v2D MOS39 0229 E128 [ FALSE=0 MOS39 0197 E10B v2D MOS39 0233 E128 | MOS39 0197 E10B v2D MOS39 0234 E128 AD 7C 02 LDA WRCHSW MOS39 0197 E10B v2D MOS39 0235 E12B 6A RORA ;**************** ASSUME WRRS = 1 **************** MOS39 0197 E10B v2D MOS39 0236 E12C 90 1B BCC WRCHNR ;[RS423 disabled] MOS39 0197 E10B v2D MOS39 0237 E12E ] MOS39 0197 E10B v2D MOS39 0238 E12E MOS39 0197 E10B v2D MOS39 0239 E12E ; WRCH via RS423 MOS39 0197 E10B v2D MOS39 0240 E12E A4 EA LDY RSTUT MOS39 0197 E10B v2D MOS39 0241 E130 88 DEY MOS39 0197 E10B v2D MOS39 0242 E131 10 16 BPL WRCHNR ;[RS423 managed by CFS, ignore WRCH request] MOS39 0197 E10B v2D MOS39 0243 E133 68 PLA MOS39 0197 E10B v2D MOS39 0244 E134 48 PHA ;A := character MOS39 0197 E10B v2D MOS39 0245 E135 ; MOS39 0197 E10B v2D MOS39 0246 E135 08 PHP MOS39 0197 E10B v2D MOS39 0247 E136 78 SEI MOS39 0197 E10B v2D MOS39 0248 E137 A2 02 LDXIM BRSO MOS39 0197 E10B v2D MOS39 0249 E139 48 PHA MOS39 0197 E10B v2D MOS39 0250 E13A 20 9F E4 JSR EXAM MOS39 0197 E10B v2D MOS39 0251 E13D 90 03 BCC WRCNP1 ;[buffer not empty] MOS39 0197 E10B v2D MOS39 0252 E13F ; RS423 output buffer empty MOS39 0197 E10B v2D MOS39 0253 E13F 20 C0 E1 JSR RSBUSY ;enable RS423 Tx interrupts MOS39 0197 E10B v2D MOS39 0254 E142 WRCNP1 MOS39 0197 E10B v2D MOS39 0255 E142 68 PLA MOS39 0197 E10B v2D MOS39 0256 E143 A2 02 LDXIM BRSO MOS39 0197 E10B v2D MOS39 0257 E145 20 49 E2 JSR WRITE ;insert character into RS423 output buffer, waiting if necessary MOS39 0197 E10B v2D MOS39 0258 E148 ; N.B. WRITE disables interrupts MOS39 0197 E10B v2D MOS39 0259 E148 ; character not inserted if ESCAPE detected MOS39 0197 E10B v2D MOS39 0260 E148 28 PLP MOS39 0197 E10B v2D MOS39 0261 E149 ; MOS39 0197 E10B v2D MOS39 0262 E149 WRCHNR ;not via RS423 MOS39 0197 E10B v2D MOS39 0263 E149 MOS39 0197 E10B v2D MOS39 0264 E149 ; check for spooling enabled MOS39 0197 E10B v2D MOS39 0265 E149 ; check whether spooling active MOS39 0197 E10B v2D MOS39 0266 E149 A9 10 LDAIM WRSPL MOS39 0197 E10B v2D MOS39 0267 E14B 2C 7C 02 BIT WRCHSW MOS39 0197 E10B v2D MOS39 0268 E14E D0 0F BNE WRCHNS ;[spooling disabled] MOS39 0197 E10B v2D MOS39 0269 E150 ; spool character MOS39 0197 E10B v2D MOS39 0270 E150 AC 57 02 LDY SPOOLH MOS39 0197 E10B v2D MOS39 0271 E153 F0 0A BEQ WRCHNS ;[spooling not active] MOS39 0197 E10B v2D MOS39 0272 E155 ; spooling active MOS39 0197 E10B v2D MOS39 0273 E155 ; write byte to spool file MOS39 0197 E10B v2D MOS39 0274 E155 68 PLA MOS39 0197 E10B v2D MOS39 0275 E156 48 PHA ;A := character MOS39 0197 E10B v2D MOS39 0276 E157 ; MOS39 0197 E10B v2D MOS39 0277 E157 38 SEC MOS39 0197 E10B v2D MOS39 0278 E158 66 EB ROR ESSEMA ;enter critical region MOS39 0197 E10B v2D MOS39 0279 E15A 20 D4 FF JSR OSBPUT MOS39 0197 E10B v2D MOS39 0280 E15D 46 EB LSR ESSEMA ;exit critical region MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 77 MOS39 MOS39 CLI MOS39 MOS39 0197 E10B v2D MOS39 0281 E15F WRCHNS ;no spooling MOS39 0197 E10B v2D MOS39 0282 E15F MOS39 0197 E10B v2D MOS39 0283 E15F WRCHNN MOS39 0197 E10B v2D MOS39 0284 E15F ; exit restoring registers MOS39 0197 E10B v2D MOS39 0285 E15F 68 PLA ;pull redundant byte -- MOS39 0286 E160 [ MOS125 = &FF -- MOS39 0287 E160 | -- MOS39 0288 E160 PLYXAR -- MOS39 0289 E160 ] -- MOS39 0290 E160 68 PLA -- MOS39 0291 E161 A8 TAY -- MOS39 0292 E162 68 PLA -- MOS39 0293 E163 AA TAX -- MOS39 0294 E164 68 PLA ;restore character -- MOS39 0295 E165 60 RTS -- MOS39 0296 E166 -- MOS39 0297 E166 MPRINT ;conditionally print character in A -- MOS39 0298 E166 ; N.B. character should never be NUL -- MOS39 0299 E166 ; decide whether to ignore character -- MOS39 0300 E166 2C 7C 02 BIT WRCHSW -- MOS39 0301 E169 70 20 BVS PRINT0 ;[only print thru VDU1] MOS39 0301 E169 v5F MOS39 0302 E16B CD 86 02 CMP PIGNOR MOS39 0301 E169 v5F MOS39 0303 E16E F0 1B BEQ PRINT0 ;[match on printer ignore character] MOS39 0301 E169 v5F MOS39 0304 E170 ; MOS39 0301 E169 v5F MOS39 0305 E170 ; MOS39 0301 E169 v5F MOS39 0306 E170 ; ====== MOS39 0301 E169 v5F MOS39 0307 E170 ; PRINT MOS39 0301 E169 v5F MOS39 0308 E170 ; ====== MOS39 0301 E169 v5F MOS39 0309 E170 ; MOS39 0301 E169 v5F MOS39 0310 E170 ; Print a character via VDU 1 MOS39 0301 E169 v5F MOS39 0311 E170 ; MOS39 0301 E169 v5F MOS39 0312 E170 ; ENTRY:- A = Character MOS39 0301 E169 v5F MOS39 0313 E170 ; MOS39 0301 E169 v5F MOS39 0314 E170 ; EXIT:- A,X,Y corrupt MOS39 0301 E169 v5F MOS39 0315 E170 ; Flags preserved MOS39 0301 E169 v5F MOS39 0316 E170 ; MOS39 0301 E169 v5F MOS39 0317 E170 PRINT ;used by VDU (SOH), uses fact of exit with C=0 MOS39 0301 E169 v5F MOS39 0318 E170 08 PHP MOS39 0301 E169 v5F MOS39 0319 E171 78 SEI MOS39 0301 E169 v5F MOS39 0320 E172 ; N.B. if print sink is 0 then character will MOS39 0301 E169 v5F MOS39 0321 E172 ; eventually be ignored by STROBE MOS39 0301 E169 v5F MOS39 0322 E172 ; MOS39 0301 E169 v5F MOS39 0323 E172 AA TAX ;save print character MOS39 0301 E169 v5F MOS39 0324 E173 ; MOS39 0301 E169 v5F MOS39 0325 E173 ; test whether printer enabled MOS39 0301 E169 v5F MOS39 0326 E173 ; MOS39 0301 E169 v5F MOS39 0327 E173 A9 04 LDAIM WRPREN MOS39 0301 E169 v5F MOS39 0328 E175 2C 7C 02 BIT WRCHSW MOS39 0301 E169 v5F MOS39 0329 E178 D0 10 BNE PRINT4 ;[printer disabled] MOS39 0301 E169 v5F MOS39 0330 E17A ; MOS39 0301 E169 v5F MOS39 0331 E17A 8A TXA ;restore print character MOS39 0301 E169 v5F MOS39 0332 E17B A2 03 LDXIM BPRNT ;X := print bufferid MOS39 0301 E169 v5F MOS39 0333 E17D 20 49 E2 JSR WRITE ;write character to buffer, waiting if necessary MOS39 0301 E169 v5F MOS39 0334 E180 B0 08 BCS PRINT3 ;[ESCAPE detected] MOS39 0301 E169 v5F MOS39 0335 E182 ; MOS39 0301 E169 v5F MOS39 0336 E182 ; test printer status; interrupts disabled MOS39 0301 E169 v5F MOS39 0337 E182 ; MOS39 0301 E169 v5F MOS39 0338 E182 2C D2 02 BIT PFLAG MOS39 0301 E169 v5F MOS39 0339 E185 10 03 BPL PRINT3 ;[printer busy] MOS39 0301 E169 v5F MOS39 0340 E187 ; MOS39 0301 E169 v5F MOS39 0341 E187 ; printer dormant MOS39 0301 E169 v5F MOS39 0342 E187 ; send the first character MOS39 0301 E169 v5F MOS39 0343 E187 ; MOS39 0301 E169 v5F MOS39 0344 E187 20 8C E1 JSR STROBE ;send character to selected printer MOS39 0301 E169 v5F MOS39 0345 E18A ; MOS39 0301 E169 v5F MOS39 0346 E18A PRINT3 ;printer busy MOS39 0301 E169 v5F MOS39 0347 E18A PRINT4 ;return enabling interrupts MOS39 0301 E169 v5F MOS39 0348 E18A 28 PLP ;restore interrupt state, set C=0 (fact used by VDU) MOS39 0301 E169 v5F MOS39 0349 E18B ; MOS39 0301 E169 v5F MOS39 0350 E18B PRINT0 MOS39 0301 E169 v5F MOS39 0351 E18B 60 RTS -- MOS39 0352 E18C -- MOS39 0353 E18C -- MOS39 0354 E18C STROBE ;send character to selected printer -- MOS39 0355 E18C ; **************************************** -- MOS39 0356 E18C ; MUST BE ENTERED WITH INTERRUPTS DISABLED -- MOS39 0357 E18C ; ********************************** -- MOS39 0358 E18C ; determine print sink -- MOS39 0359 E18C AD 85 02 LDA PRNTSW -- MOS39 0360 E18F F0 6C BEQ PURGE ;[ignore print request] MOS39 0360 E18F v13 MOS39 0361 E191 ; print sink determined by PRNTSW MOS39 0360 E18F v13 MOS39 0362 E191 ; 0: infinite print sink MOS39 0360 E18F v13 MOS39 0363 E191 ; 1: centronics MOS39 0360 E18F v13 MOS39 0364 E191 ; 2: RS423 output MOS39 0360 E18F v13 MOS39 0365 E191 ; 3: user print routine MOS39 0360 E18F v13 MOS39 0366 E191 ; 4: net printer server MOS39 0360 E18F v13 MOS39 0367 E191 [ MOS125 = &FF MOS39 0360 E18F v13 MOS39 0370 E191 | MOS39 0360 E18F v13 MOS39 0371 E191 C9 02 CMPIM PRS MOS39 0360 E18F v13 MOS39 0372 E193 B0 21 BCS STROB1 ;[not centronics] MOS39 0360 E18F v13 MOS39 0373 E195 ] MOS39 0360 E18F v13 MOS39 0374 E195 ; centronics interface MOS39 0360 E18F v13 MOS39 0375 E195 ; this code must be executed with interrupts disabled MOS39 0360 E18F v13 MOS39 0376 E195 ; otherwise a CA1 interrupt coinciding with the STA PAR MOS39 0360 E18F v13 MOS39 0377 E195 ; would result in a spurious interrupt which would not MOS39 0360 E18F v13 MOS39 0378 E195 ; be recognised, resulting in a 'Bad IRQ' state MOS39 0360 E18F v13 MOS39 0379 E195 20 A4 E4 JSR REMOV ;remove character from print buffer MOS39 0360 E18F v13 MOS39 0380 E198 6E D2 02 ROR PFLAG MOS39 0360 E18F v13 MOS39 0381 E19B 30 43 BMI STROB0 ;[no more characters to print] MOS39 0360 E18F v13 MOS39 0382 E19D A0 82 LDYIM &82 MOS39 0360 E18F v13 MOS39 0383 E19F 8C 6E FE STY IERR ;enable parallel port printer interrupt MOS39 0360 E18F v13 MOS39 0384 E1A2 ; write character MOS39 0360 E18F v13 MOS39 0385 E1A2 8D 61 FE STA PAR MOS39 0360 E18F v13 MOS39 0386 E1A5 ; pulse strobe line MOS39 0360 E18F v13 MOS39 0387 E1A5 AD 6C FE LDA PCRR MOS39 0360 E18F v13 MOS39 0388 E1A8 29 F1 ANDIM &F1 ;********** DO NOT CHANGE MOS39 0360 E18F v13 MOS39 0389 E1AA 09 0C ORAIM CA2LO ;********** DO NOT CHANGE MOS39 0360 E18F v13 MOS39 0390 E1AC 8D 6C FE STA PCRR ;CA2 strobe lo (signal inverted by h/w) MOS39 0360 E18F v13 MOS39 0391 E1AF 09 0E ORAIM CA2HI ;********** DO NOT CHANGE MOS39 0360 E18F v13 MOS39 0392 E1B1 8D 6C FE STA PCRR ;CA2 strobe hi (signal inverted by h/w) MOS39 0360 E18F v13 MOS39 0393 E1B4 ; N.B. leave signal hi MOS39 0360 E18F v13 MOS39 0394 E1B4 D0 2A BNE STROB0 ;[ALWAYS jump, exit] MOS39 0360 E18F v13 MOS39 0395 E1B6 MOS39 0360 E18F v13 MOS39 0396 E1B6 STROB1 ;not centronics MOS39 0360 E18F v13 MOS39 0397 E1B6 ; X = bufferid MOS39 0360 E18F v13 MOS39 0398 E1B6 [ MOS125 = &FF MOS39 0360 E18F v13 MOS39 0400 E1B6 ] MOS39 0360 E18F v13 MOS39 0401 E1B6 D0 29 BNE STROB3 ;[not RS423] MOS39 0360 E18F v13 MOS39 0402 E1B8 ; printer is RS423 MOS39 0360 E18F v13 MOS39 0403 E1B8 A4 EA LDY RSTUT MOS39 0360 E18F v13 MOS39 0404 E1BA 88 DEY MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 78 MOS39 MOS39 CLI MOS39 MOS39 0360 E18F v13 MOS39 0405 E1BB 10 40 BPL STCRS ;[RS423 printer managed by CFS, ignore print request] MOS39 0360 E18F v13 MOS39 0406 E1BD ; print to RS423 MOS39 0360 E18F v13 MOS39 0407 E1BD 4E D2 02 LSR PFLAG ;flag printer busy MOS39 0360 E18F v13 MOS39 0408 E1C0 ; MOS39 0360 E18F v13 MOS39 0409 E1C0 RSBUSY MOS39 0360 E18F v13 MOS39 0410 E1C0 4E 4F 02 LSR RSFLAG ;flag RS423 busy MOS39 0360 E18F v13 MOS39 0411 E1C3 ; MOS39 0360 E18F v13 MOS39 0412 E1C3 RSETX ;enable RS423 Tx interrupts MOS39 0360 E18F v13 MOS39 0413 E1C3 20 83 E7 JSR CNTRS MOS39 0360 E18F v13 MOS39 0414 E1C6 90 18 BCC RSOVF ;[RS423 input buffer overflow] MOS39 0360 E18F v13 MOS39 0415 E1C8 ; MOS39 0360 E18F v13 MOS39 0416 E1C8 A2 20 LDXIM RHITXE ;set RTS hi, Tx interrupt enabled MOS39 0360 E18F v13 MOS39 0417 E1CA ; MOS39 0360 E18F v13 MOS39 0418 E1CA RSED ;alter Tx control register to X MOS39 0360 E18F v13 MOS39 0419 E1CA A0 9F LDYIM &9F ;field is b6-b5 MOS39 0360 E18F v13 MOS39 0420 E1CC ; MOS39 0360 E18F v13 MOS39 0421 E1CC RS423 MOS39 0360 E18F v13 MOS39 0422 E1CC 08 PHP MOS39 0360 E18F v13 MOS39 0423 E1CD 78 SEI MOS39 0360 E18F v13 MOS39 0424 E1CE 98 TYA ;A := mask MOS39 0360 E18F v13 MOS39 0425 E1CF ; ***************************************** MOS39 0360 E18F v13 MOS39 0426 E1CF ; MUST BE EXECUTED WITH INTERRUPTS DISABLED MOS39 0360 E18F v13 MOS39 0427 E1CF ; ***************************************** MOS39 0360 E18F v13 MOS39 0428 E1CF ; A = mask (altered) MOS39 0360 E18F v13 MOS39 0429 E1CF ; X = new value MOS39 0360 E18F v13 MOS39 0430 E1CF 86 FA STX RSOP ;save new value of field MOS39 0360 E18F v13 MOS39 0431 E1D1 2D 50 02 AND RSCTFL ;copy status and clear field for new status MOS39 0360 E18F v13 MOS39 0432 E1D4 45 FA EOR RSOP ;add in new status MOS39 0360 E18F v13 MOS39 0433 E1D6 AE 50 02 LDX RSCTFL ;X := old value MOS39 0360 E18F v13 MOS39 0434 E1D9 STARSC ;used by MC6850 N.B. does PLP RTS MOS39 0360 E18F v13 MOS39 0435 E1D9 MOS39 0360 E18F v13 MOS39 0436 E1D9 8D 50 02 STA RSCTFL ;update record of status MOS39 0360 E18F v13 MOS39 0437 E1DC 8D 08 FE STA RSCTL ;update 6850 MOS39 0360 E18F v13 MOS39 0438 E1DF 28 PLP MOS39 0360 E18F v13 MOS39 0439 E1E0 RSOVF ;RS423 input buffer overflow MOS39 0360 E18F v13 MOS39 0440 E1E0 STROB0 MOS39 0360 E18F v13 MOS39 0441 E1E0 60 RTS MOS39 0360 E18F v13 MOS39 0442 E1E1 MOS39 0360 E18F v13 MOS39 0443 E1E1 STROB3 ;not RS423 MOS39 0360 E18F v13 MOS39 0444 E1E1 MOS39 0360 E18F v13 MOS39 0445 E1E1 18 CLC MOS39 0360 E18F v13 MOS39 0446 E1E2 MOS39 0360 E18F v13 MOS39 0447 E1E2 ; C=0 MOS39 0360 E18F v13 MOS39 0448 E1E2 ; user or net print MOS39 0360 E18F v13 MOS39 0449 E1E2 ; X=print_bufferid MOS39 0360 E18F v13 MOS39 0450 E1E2 ; character in printer buffer MOS39 0360 E18F v13 MOS39 0451 E1E2 A9 01 LDAIM UPWRCH MOS39 0360 E18F v13 MOS39 0452 E1E4 20 F2 E1 JSR mUPT ;call print routine (returns with carry meaningful) MOS39 0360 E18F v13 MOS39 0453 E1E7 PFREE ;indicate printer dormant (OSBYTE call used by UPT routine) MOS39 0360 E18F v13 MOS39 0454 E1E7 6E D2 02 ROR PFLAG ;set printer status according to user print routine MOS39 0360 E18F v13 MOS39 0455 E1EA ; C=0 => printer busy MOS39 0360 E18F v13 MOS39 0456 E1EA ; C=1 => printer free MOS39 0360 E18F v13 MOS39 0457 E1EA ; (default user print routine is DEFUPT) MOS39 0360 E18F v13 MOS39 0458 E1EA UPTRTS MOS39 0360 E18F v13 MOS39 0459 E1EA 60 RTS MOS39 0360 E18F v13 MOS39 0460 E1EB MOS39 0360 E18F v13 MOS39 0461 E1EB MOS39 0360 E18F v13 MOS39 0462 E1EB UPTINT ;timer interrupt MOS39 0360 E18F v13 MOS39 0463 E1EB 2C D2 02 BIT PFLAG MOS39 0360 E18F v13 MOS39 0464 E1EE 30 FA BMI UPTRTS ;[printer dormant] MOS39 0360 E18F v13 MOS39 0465 E1F0 ; MOS39 0360 E18F v13 MOS39 0466 E1F0 ; give a hand to polled printers MOS39 0360 E18F v13 MOS39 0467 E1F0 A9 00 LDAIM UPTIME MOS39 0360 E18F v13 MOS39 0468 E1F2 ; MOS39 0360 E18F v13 MOS39 0469 E1F2 MUPT ;call user print routine (also used by VDU software) MOS39 0360 E18F v13 MOS39 0470 E1F2 ; A = reason code ($02/$03) MOS39 0360 E18F v13 MOS39 0471 E1F2 A2 03 LDXIM BPRNT ;X := print buffer id MOS39 0360 E18F v13 MOS39 0472 E1F4 ; MOS39 0360 E18F v13 MOS39 0473 E1F4 UPTX ;entered by *FX5 MOS39 0360 E18F v13 MOS39 0474 E1F4 AC 85 02 LDY PRNTSW ;Y := current print selection MOS39 0360 E18F v13 MOS39 0475 E1F7 20 C1 E5 JSR JMINET ;call net print routine MOS39 0360 E18F v13 MOS39 0476 E1FA 6C 22 02 JMI UPTVEC ;call user print routine AND return MOS39 0360 E18F v13 MOS39 0477 E1FD MOS39 0360 E18F v13 MOS39 0478 E1FD MOS39 0360 E18F v13 MOS39 0479 E1FD STROB4 ;not user print MOS39 0360 E18F v13 MOS39 0480 E1FD STCRS ;RS423 managed by cassette MOS39 0360 E18F v13 MOS39 0481 E1FD ; ignore print request by purging buffer AND return MOS39 0360 E18F v13 MOS39 0482 E1FD PURGE MOS39 0360 E18F v13 MOS39 0483 E1FD ; purge buffer given by index in X MOS39 0360 E18F v13 MOS39 0484 E1FD ; this routine does not corrupt A or X MOS39 0360 E18F v13 MOS39 0485 E1FD 18 CLC -- MOS39 0486 E1FE ; -- MOS39 0487 E1FE PURGEX ;entered by OSWORD sound routine with C=1 -- MOS39 0488 E1FE 48 PHA ;save A -- MOS39 0489 E1FF 08 PHP ;save interrupt state -- MOS39 0490 E200 78 SEI -- MOS39 0491 E201 ; -- MOS39 0492 E201 ; kill sound channel if sound buffer -- MOS39 0493 E201 B0 08 BCS PURNSB ;[OSWORD call so do not kill sound] MOS39 0493 E201 v77 MOS39 0494 E203 BD B2 E9 LDAAX BUFTYP MOS39 0493 E201 v77 MOS39 0495 E206 10 03 BPL PURNSB ;[not a sound buffer] MOS39 0493 E201 v77 MOS39 0496 E208 ; kill sound on channel X MOS39 0493 E201 v77 MOS39 0497 E208 20 C5 EC JSR SCRST MOS39 0493 E201 v77 MOS39 0498 E20B PURNSB MOS39 0493 E201 v77 MOS39 0499 E20B [ MOS125 = &FF MOS39 0493 E201 v77 MOS39 0514 E20B | MOS39 0493 E201 v77 MOS39 0515 E20B ; MOS39 0493 E201 v77 MOS39 0516 E20B ; check for input buffer MOS39 0493 E201 v77 MOS39 0517 E20B E0 02 CPXIM OUTPUT -- MOS39 0518 E20D B0 08 BCS VAULT ;[output buffer] MOS39 0518 E20D v77 MOS39 0519 E20F ; MOS39 0518 E20D v77 MOS39 0520 E20F ; input buffer, kill soft key expansion and VDU queueing MOS39 0518 E20D v77 MOS39 0521 E20F ; MOS39 0518 E20D v77 MOS39 0522 E20F A9 00 LDAIM ZERO MOS39 0518 E20D v77 MOS39 0523 E211 8D 68 02 STA SOFKL ;kill soft key expansion MOS39 0518 E20D v77 MOS39 0524 E214 8D 6A 02 STA QPOSN ;kill VDU queueing MOS39 0518 E20D v77 MOS39 0525 E217 ; MOS39 0518 E20D v77 MOS39 0526 E217 ;if input buffer OR first output buffer i.e. RS423 MOS39 0518 E20D v77 MOS39 0527 E217 ;then Z=1; buffer flag unused, preserve MOS39 0518 E20D v77 MOS39 0528 E217 F0 03 VAULT BEQ PURGE3 MOS39 0528 E217 v7C MOS39 0529 E219 ;otherwise C=1 MOS39 0528 E217 v7C MOS39 0530 E219 ; flag buffer dormant MOS39 0528 E217 v7C MOS39 0531 E219 7E CF 02 RORAX BACTIV MOS39 0528 E217 v7C MOS39 0532 E21C ;CNPV routine ignores C when V=1 MOS39 0528 E217 v7C MOS39 0533 E21C ] MOS39 0528 E217 v7C MOS39 0534 E21C ; MOS39 0528 E217 v7C MOS39 0535 E21C PURGE3 MOS39 0528 E217 v7C MOS39 0536 E21C ; MOS39 0528 E217 v7C MOS39 0537 E21C 20 7D E7 JSR JMIPUR ;use indirection with V=1 (defaults to CNP) -- MOS39 0538 E21F ; -- MOS39 0539 E21F 28 PLP ;restore interrupt state MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 79 MOS39 MOS39 CLI MOS39 -- MOS39 0540 E220 68 PLA ;restore A -- MOS39 0541 E221 60 RTS -- MOS39 0542 E222 ; -- MOS39 0543 E222 ; -- MOS39 0544 E222 CNP ;count buffer entries / purge buffer -- MOS39 0545 E222 [ $Tutu -- MOS39 0548 E222 | -- MOS39 0549 E222 50 07 BVC COUNT ;[count buffer entries] MOS39 0549 E222 v78 MOS39 0550 E224 ] MOS39 0549 E222 v78 MOS39 0551 E224 ; MOS39 0549 E222 v78 MOS39 0552 E224 ; purge buffer MOS39 0549 E222 v78 MOS39 0553 E224 ; MOS39 0549 E222 v78 MOS39 0554 E224 ; reset buffer pointers MOS39 0549 E222 v78 MOS39 0555 E224 ; set buffer start = buffer end MOS39 0549 E222 v78 MOS39 0556 E224 BD D8 02 LDAAX BFSTRT MOS39 0549 E222 v78 MOS39 0557 E227 9D E1 02 STAAX BFEND MOS39 0549 E222 v78 MOS39 0558 E22A 60 RTS MOS39 0549 E222 v78 MOS39 0559 E22B ; MOS39 0549 E222 v78 MOS39 0560 E22B ; MOS39 0549 E222 v78 MOS39 0561 E22B COUNT MOS39 0549 E222 v78 MOS39 0562 E22B 08 PHP -- MOS39 0563 E22C 78 SEI -- MOS39 0564 E22D ; -- MOS39 0565 E22D 08 PHP ;save count type -- MOS39 0566 E22E ; -- MOS39 0567 E22E 38 SEC -- MOS39 0568 E22F BD E1 02 LDAAX BFEND -- MOS39 0569 E232 FD D8 02 SBCAX BFSTRT -- MOS39 0570 E235 B0 04 BCS BUFNX1 MOS39 0570 E235 v7B MOS39 0571 E237 ; adjust for overflow MOS39 0570 E235 v7B MOS39 0572 E237 38 SEC MOS39 0570 E235 v7B MOS39 0573 E238 FD 8B E4 SBCAX BFORG MOS39 0570 E235 v7B MOS39 0574 E23B BUFNX1 MOS39 0570 E235 v7B MOS39 0575 E23B ; MOS39 0570 E235 v7B MOS39 0576 E23B 28 PLP ;restore count type -- MOS39 0577 E23C ; -- MOS39 0578 E23C 90 06 BCC BFCNT0 ;[input buffer] MOS39 0578 E23C v79 MOS39 0579 E23E ; MOS39 0578 E23C v79 MOS39 0580 E23E ; output buffer MOS39 0578 E23C v79 MOS39 0581 E23E ; adjust to give remaining entries MOS39 0578 E23C v79 MOS39 0582 E23E 18 CLC MOS39 0578 E23C v79 MOS39 0583 E23F 7D 8B E4 ADCAX BFORG MOS39 0578 E23C v79 MOS39 0584 E242 49 FF EORIM &FF MOS39 0578 E23C v79 MOS39 0585 E244 ; MOS39 0578 E23C v79 MOS39 0586 E244 BFCNT0 MOS39 0578 E23C v79 MOS39 0587 E244 A0 00 LDYIM ZERO -- MOS39 0588 E246 AA TAX -- MOS39 0589 E247 ; -- MOS39 0590 E247 28 PLP -- MOS39 0591 E248 60 RTS -- MOS39 0592 E249 -- MOS39 0593 E249 -- MOS39 0594 E249 LNK MOS40 -- MOS40 0001 E249 -- MOS40 0002 E249 ; MOS40 -- MOS40 0003 E249 TTL MOS40 Machine operating system internal commands -- MOS40 0004 E249 OPT MOS40 MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 80 MOS40 MOS40 Machine operating system internal commands MOS40 -- MOS40 0005 E249 ;(c) 1981 ACORN Computers Limited -- MOS40 0006 E249 ;BBC Microcomputer Machine Operating System (MOS) -- MOS40 0007 E249 ;Change record: -- MOS40 0008 E249 ;033 12-Aug-81 PB Reset SKNEND code, check KEY line termination -- MOS40 0009 E249 ;032 12-Aug-81 PB Extracted from CLI code -- MOS40 0010 E249 ;Author(s): -- MOS40 0011 E249 ;PB Paul Bond -- MOS40 0012 E249 ;MP Mike Prees -- MOS40 0013 E249 -- MOS40 0014 E249 -- MOS40 0015 E249 WRITE -- MOS40 0016 E249 WRITE1 -- MOS40 0017 E249 78 SEI ;another critical region MOS40 0039 E25C ^6B MOS40 0018 E24A 20 F4 E4 JSR INSRT ;attempt to add character to print queue MOS40 0039 E25C ^6B MOS40 0019 E24D 90 0F BCC WRITE0 ;[character inserted into printer buffer] MOS40 0039 E25C ^6B MOS40 0020 E24F ; printer buffer full MOS40 0039 E25C ^6B MOS40 0021 E24F ; C=1 MOS40 0039 E25C ^6B MOS40 0022 E24F 20 EF E9 JSR LEDSON ;conditionally set LEDs and test escape condition MOS40 0039 E25C ^6B MOS40 0023 E252 ; N.B. does not corrupt C or X MOS40 0039 E25C ^6B MOS40 0024 E252 ; C=1 MOS40 0039 E25C ^6B MOS40 0025 E252 ; reset LEDs MOS40 0039 E25C ^6B MOS40 0026 E252 08 PHP MOS40 0039 E25C ^6B MOS40 0027 E253 48 PHA MOS40 0039 E25C ^6B MOS40 0028 E254 20 04 EF JSR KBDIS MOS40 0039 E25C ^6B MOS40 0029 E257 68 PLA MOS40 0039 E25C ^6B MOS40 0030 E258 28 PLP MOS40 0039 E25C ^6B MOS40 0031 E259 ; MOS40 0039 E25C ^6B MOS40 0032 E259 30 03 BMI WRITE0 ;[escape detected] MOS40 0039 E25C ^6B MOS40 0033 E25B 58 CLI ;enable interrupts to allow printer buffer to purge. MOS40 0039 E25C ^6B MOS40 0034 E25C ; Interrupts are enabled at this part of the loop, MOS40 0039 E25C ^6B MOS40 0035 E25C ; rather than at the begining (which would save 2 bytes of code) MOS40 0039 E25C ^6B MOS40 0036 E25C ; in order to ensure that if the print routine is called with MOS40 0039 E25C ^6B MOS40 0037 E25C ; interrupts disabled, then interrupts are not enabled if there is MOS40 0039 E25C ^6B MOS40 0038 E25C ; room in the print buffer. MOS40 0039 E25C ^6B MOS40 0039 E25C B0 EB BCS WRITE1 ;[ALWAYS jump, wait for room in printer buffer, C=1] MOS40 0019 E24D v70 MOS40 0040 E25E WRITE0 MOS40 0019 E24D v70 MOS40 0041 E25E 60 RTS -- MOS40 0042 E25F -- MOS40 0043 E25F -- MOS40 0044 E25F CLRFB ;clear file control block -- MOS40 0045 E25F 48 PHA -- MOS40 0046 E260 A9 00 LDAIM ZERO -- MOS40 0047 E262 9D EE 02 STAAX FBLOCK -- MOS40 0048 E265 9D EF 02 STAAX FBLOCK +&01 -- MOS40 0049 E268 9D F0 02 STAAX FBLOCK +&02 -- MOS40 0050 E26B 9D F1 02 STAAX FBLOCK +&03 -- MOS40 0051 E26E 68 PLA -- MOS40 0052 E26F 60 RTS -- MOS40 0053 E270 [ MOS125 = &FF -- MOS40 0076 E270 | -- MOS40 0077 E270 20 93 E0 LSA JSR SKIPSP -- MOS40 0078 E273 20 E1 E0 JSR TSTHEX -- MOS40 0079 E276 90 1F BCC LSA0 ;[hex not present, return V=1] MOS40 0079 E276 v60 MOS40 0080 E278 ; MOS40 0079 E276 v60 MOS40 0081 E278 ; clear field MOS40 0079 E276 v60 MOS40 0082 E278 ; MOS40 0079 E276 v60 MOS40 0083 E278 20 5F E2 JSR CLRFB MOS40 0079 E276 v60 MOS40 0084 E27B ; MOS40 0079 E276 v60 MOS40 0085 E27B ; read address MOS40 0079 E276 v60 MOS40 0086 E27B ; MOS40 0079 E276 v60 MOS40 0087 E27B LSA1 ;rotate hex digit into 4-byte address MOS40 0079 E276 v60 MOS40 0088 E27B ; move nibble into high nibble MOS40 0079 E276 v60 MOS40 0089 E27B ;set b3, clear b2..0 MOS40 0079 E276 v60 MOS40 0090 E27B ;SEC ;C=1 from BCC LSA0 (CLRFB preserves) or BCS LSA1 MOS40 0079 E276 v60 MOS40 0091 E27B 2A ROLA MOS40 0079 E276 v60 MOS40 0092 E27C 0A ASLA MOS40 0079 E276 v60 MOS40 0093 E27D 0A ASLA MOS40 0079 E276 v60 MOS40 0094 E27E 0A ASLA MOS40 0079 E276 v60 MOS40 0095 E27F ;shift once more. C=hex b3, A b4=1, b3..0=0 MOS40 0079 E276 v60 MOS40 0096 E27F 0A ASLA MOS40 0079 E276 v60 MOS40 0097 E280 ROL4A ;rotate bit into address MOS40 0079 E276 v60 MOS40 0098 E280 3E EE 02 ROLAX FBLOCK MOS40 0079 E276 v60 MOS40 0099 E283 3E EF 02 ROLAX FBLOCK +&01 MOS40 0079 E276 v60 MOS40 0100 E286 3E F0 02 ROLAX FBLOCK +&02 MOS40 0079 E276 v60 MOS40 0101 E289 3E F1 02 ROLAX FBLOCK +&03 MOS40 0079 E276 v60 MOS40 0102 E28C B0 35 BCS MBADHX ;[overflow] MOS40 0102 E28C v4A MOS40 0103 E28E ; C=0 MOS40 0102 E28C v4A MOS40 0104 E28E 0A ASLA MOS40 0102 E28C v4A MOS40 0105 E28F D0 EF BNE ROL4A ;execute loop four times MOS40 0102 E28C v4A MOS40 0106 E291 ; C=1 which TSTHEX ignores MOS40 0102 E28C v4A MOS40 0107 E291 20 E1 E0 JSR TSTHEX MOS40 0102 E28C v4A MOS40 0108 E294 B0 E5 BCS LSA1 MOS40 0102 E28C v4A MOS40 0109 E296 38 SEC ;return C=1 MOS40 0102 E28C v4A MOS40 0110 E297 LSA0 ;Z=1 => CR terminator MOS40 0102 E28C v4A MOS40 0111 E297 60 RTS MOS40 0102 E28C v4A MOS40 0112 E298 ] MOS40 0102 E28C v4A MOS40 0113 E298 MOS40 0102 E28C v4A MOS40 0114 E298 MOS40 0102 E28C v4A MOS40 0115 E298 LOAD ;LOAD [load address] MOS40 0102 E28C v4A MOS40 0116 E298 A9 FF LDAIM &FF MOS40 0102 E28C v4A MOS40 0117 E29A SAVE ;(A=$00) SAVE [exechex] [loadhex] MOS40 0102 E28C v4A MOS40 0118 E29A 86 F2 STX WORK MOS40 0102 E28C v4A MOS40 0119 E29C 84 F3 STY WORK +&01 MOS40 0102 E28C v4A MOS40 0120 E29E 8E EE 02 STX FBLOCK+FSTR+&0 MOS40 0102 E28C v4A MOS40 0121 E2A1 8C EF 02 STY FBLOCK+FSTR+&1 MOS40 0102 E28C v4A MOS40 0122 E2A4 48 PHA MOS40 0102 E28C v4A MOS40 0123 E2A5 ; clear load address MOS40 0102 E28C v4A MOS40 0124 E2A5 A2 02 LDXIM FLOAD MOS40 0102 E28C v4A MOS40 0125 E2A7 20 5F E2 JSR CLRFB MOS40 0102 E28C v4A MOS40 0126 E2AA ; set lsb exec address = $FF (preparing for possible LOAD) MOS40 0102 E28C v4A MOS40 0127 E2AA A0 FF LDYIM &FF MOS40 0102 E28C v4A MOS40 0128 E2AC 8C F4 02 STY FBLOCK+FEXEC ;'use file load address' MOS40 0102 E28C v4A MOS40 0129 E2AF ; set to read characters from WORK buffer MOS40 0102 E28C v4A MOS40 0130 E2AF C8 INY ;Y:=0 MOS40 0102 E28C v4A MOS40 0131 E2B0 ; skip filename MOS40 0102 E28C v4A MOS40 0132 E2B0 20 78 EA JSR GSINTC MOS40 0102 E28C v4A MOS40 0133 E2B3 20 8A EA LS2 JSR GSREAD MOS40 0102 E28C v4A MOS40 0134 E2B6 90 FB BCC LS2 ;[string character] MOS40 0102 E28C v4A MOS40 0135 E2B8 ; determine command type MOS40 0102 E28C v4A MOS40 0136 E2B8 68 PLA MOS40 0102 E28C v4A MOS40 0137 E2B9 48 PHA MOS40 0102 E28C v4A MOS40 0138 E2BA F0 4D BEQ SAVEX ;[SAVE command] MOS40 0138 E2BA v32 MOS40 0139 E2BC ; LOAD command MOS40 0138 E2BA v32 MOS40 0140 E2BC ; MOS40 0138 E2BA v32 MOS40 0141 E2BC ; read load address MOS40 0138 E2BA v32 MOS40 0142 E2BC ; N.B. X=FLOAD MOS40 0138 E2BA v32 MOS40 0143 E2BC 20 70 E2 JSR LSA MOS40 0138 E2BA v32 MOS40 0144 E2BF B0 3B BCS LOADX1 ;hex present MOS40 0138 E2BA v32 MOS40 0145 E2C1 F0 3E BEQ LS0 ;[just CR terminator] MOS40 0138 E2BA v32 MOS40 0146 E2C3 MBADHX ;report error 'Bad address' MOS40 0138 E2BA v32 MOS40 0147 E2C3 00 BRK MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 81 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0138 E2BA v32 MOS40 0148 E2C4 FC = BADADR MOS40 0138 E2BA v32 MOS40 0149 E2C5 42 61 64 = "Bad address" MOS40 0138 E2BA v32 MOS40 0150 E2D0 00 = ZERO ;message terminator MOS40 0138 E2BA v32 MOS40 0151 E2D1 MOS40 0138 E2BA v32 MOS40 0152 E2D1 MOS40 0138 E2BA v32 MOS40 0153 E2D1 SHUTES ;shut EXEC and SPOOL files MOS40 0138 E2BA v32 MOS40 0154 E2D1 MOS40 0138 E2BA v32 MOS40 0155 E2D1 ; MOS40 0138 E2BA v32 MOS40 0156 E2D1 ; inform paged ROMs of intentions MOS40 0138 E2BA v32 MOS40 0157 E2D1 ; MOS40 0138 E2BA v32 MOS40 0158 E2D1 A2 10 LDXIM SVSHES MOS40 0138 E2BA v32 MOS40 0159 E2D3 20 74 F1 JSR SVOP MOS40 0138 E2BA v32 MOS40 0160 E2D6 F0 23 BEQ SPOOL0 ;[claimed, do not close files] MOS40 0138 E2BA v32 MOS40 0161 E2D8 ; MOS40 0138 E2BA v32 MOS40 0162 E2D8 ; deal with EXEC file MOS40 0138 E2BA v32 MOS40 0163 E2D8 ; MOS40 0138 E2BA v32 MOS40 0164 E2D8 20 BB F6 JSR ECLOSE ;Close EXEC file MOS40 0138 E2BA v32 MOS40 0165 E2DB ; MOS40 0138 E2BA v32 MOS40 0166 E2DB ; close SPOOL file AND return MOS40 0138 E2BA v32 MOS40 0167 E2DB ; MOS40 0138 E2BA v32 MOS40 0168 E2DB A9 00 LDAIM ZERO ;Z=1, A=$00 MOS40 0138 E2BA v32 MOS40 0169 E2DD ; MOS40 0138 E2BA v32 MOS40 0170 E2DD SPOOL ;SPOOL MOS40 0138 E2BA v32 MOS40 0171 E2DD ; XY -> filename MOS40 0138 E2BA v32 MOS40 0172 E2DD ; A = $00 MOS40 0138 E2BA v32 MOS40 0173 E2DD ; EQ -> spool off MOS40 0138 E2BA v32 MOS40 0174 E2DD ;remember whether to just turn spooling off MOS40 0138 E2BA v32 MOS40 0175 E2DD 08 PHP MOS40 0138 E2BA v32 MOS40 0176 E2DE ; close old spool file MOS40 0138 E2BA v32 MOS40 0177 E2DE 84 E6 STY SPOOLY ;save Y MOS40 0138 E2BA v32 MOS40 0178 E2E0 AC 57 02 LDY SPOOLH MOS40 0138 E2BA v32 MOS40 0179 E2E3 8D 57 02 STA SPOOLH ;clear spooling MOS40 0138 E2BA v32 MOS40 0180 E2E6 F0 03 BEQ SPOOL2 ;[not currently spooling] MOS40 0138 E2BA v32 MOS40 0181 E2E8 ; A=0 MOS40 0138 E2BA v32 MOS40 0182 E2E8 20 CE FF JSR OSFIND ;close spool file MOS40 0138 E2BA v32 MOS40 0183 E2EB SPOOL2 MOS40 0138 E2BA v32 MOS40 0184 E2EB A4 E6 LDY SPOOLY ;restore Y MOS40 0138 E2BA v32 MOS40 0185 E2ED 28 PLP MOS40 0138 E2BA v32 MOS40 0186 E2EE F0 0B BEQ SPOOL0 ;[just close spool file] MOS40 0138 E2BA v32 MOS40 0187 E2F0 ; open given spool file MOS40 0138 E2BA v32 MOS40 0188 E2F0 A9 80 LDAIM &80 ;open file for output MOS40 0138 E2BA v32 MOS40 0189 E2F2 20 CE FF JSR OSFIND MOS40 0138 E2BA v32 MOS40 0190 E2F5 A8 TAY MOS40 0138 E2BA v32 MOS40 0191 E2F6 F0 5D BEQ BADFX ;[open failure] MOS40 0191 E2F6 v22 MOS40 0192 E2F8 8D 57 02 STA SPOOLH MOS40 0191 E2F6 v22 MOS40 0193 E2FB SPOOL0 ;Z=1 MOS40 0191 E2F6 v22 MOS40 0194 E2FB 60 RTS MOS40 0191 E2F6 v22 MOS40 0195 E2FC MOS40 0191 E2F6 v22 MOS40 0196 E2FC MOS40 0191 E2F6 v22 MOS40 0197 E2FC LOADX1 ;explicit load address given MOS40 0191 E2F6 v22 MOS40 0198 E2FC D0 57 BNE BADFX ;[no CR terminator] MOS40 0191 E2F6 v22 MOS40 0199 E2FE EE F4 02 INC FBLOCK+FEXEC ;use explicit load address MOS40 0191 E2F6 v22 MOS40 0200 E301 LS0 ;load file MOS40 0191 E2F6 v22 MOS40 0201 E301 A2 EE LDXIM FBLOCK MOS40 0191 E2F6 v22 MOS40 0202 E303 A0 02 LDYIM /(FBLOCK ) MOS40 0191 E2F6 v22 MOS40 0203 E305 68 PLA MOS40 0191 E2F6 v22 MOS40 0204 E306 4C DD FF JMP OSFILE MOS40 0191 E2F6 v22 MOS40 0205 E309 ; MOS40 0191 E2F6 v22 MOS40 0206 E309 [ MOS125 = &FF MOS40 0191 E2F6 v22 MOS40 0223 E309 ] MOS40 0191 E2F6 v22 MOS40 0224 E309 ; MOS40 0191 E2F6 v22 MOS40 0225 E309 ; MOS40 0191 E2F6 v22 MOS40 0226 E309 SAVEX ;SAVE command MOS40 0191 E2F6 v22 MOS40 0227 E309 ; MOS40 0191 E2F6 v22 MOS40 0228 E309 ; read FROM address MOS40 0191 E2F6 v22 MOS40 0229 E309 ; MOS40 0191 E2F6 v22 MOS40 0230 E309 A2 0A LDXIM FFROM MOS40 0191 E2F6 v22 MOS40 0231 E30B 20 70 E2 JSR LSA MOS40 0191 E2F6 v22 MOS40 0232 E30E 90 45 BCC BADFX MOS40 0191 E2F6 v22 MOS40 0233 E310 ; MOS40 0191 E2F6 v22 MOS40 0234 E310 ; read TO address MOS40 0191 E2F6 v22 MOS40 0235 E310 ; check if preceeded by '+' MOS40 0191 E2F6 v22 MOS40 0236 E310 ; MOS40 0191 E2F6 v22 MOS40 0237 E310 [ MOS125 = &FF MOS40 0191 E2F6 v22 MOS40 0243 E310 | MOS40 0191 E2F6 v22 MOS40 0244 E310 B1 F2 LDAIY WORK MOS40 0191 E2F6 v22 MOS40 0245 E312 49 AB EORIM "+":EOR:&80 MOS40 0191 E2F6 v22 MOS40 0246 E314 69 FE ADCIM &FE ;c=1, set V iff symbol='+' MOS40 0191 E2F6 v22 MOS40 0247 E316 50 01 BVC SAVEX3 ;['+' not present] MOS40 0191 E2F6 v22 MOS40 0248 E318 ] MOS40 0191 E2F6 v22 MOS40 0249 E318 C8 INY ;skip '+' symbol MOS40 0191 E2F6 v22 MOS40 0250 E319 SAVEX3 MOS40 0191 E2F6 v22 MOS40 0251 E319 A2 0E LDXIM FTO MOS40 0191 E2F6 v22 MOS40 0252 E31B 20 70 E2 JSR LSA ;N.B. does not corrupt V MOS40 0191 E2F6 v22 MOS40 0253 E31E 90 35 BCC BADFX ;[to address not given] MOS40 0191 E2F6 v22 MOS40 0254 E320 ; C=1 MOS40 0191 E2F6 v22 MOS40 0255 E320 08 PHP ;Z => no exec address MOS40 0191 E2F6 v22 MOS40 0256 E321 ; if '+' was specified then the TO address was really MOS40 0191 E2F6 v22 MOS40 0257 E321 ; a length specification MOS40 0191 E2F6 v22 MOS40 0258 E321 50 0F BVC SAVEX4 ;['+' not specified] MOS40 0191 E2F6 v22 MOS40 0259 E323 ; convert length to end address MOS40 0191 E2F6 v22 MOS40 0260 E323 ; N.B. C=1 MOS40 0191 E2F6 v22 MOS40 0261 E323 00FC MINUS4 * &00FC MOS40 0191 E2F6 v22 MOS40 0262 E323 A2 FC LDXIM MINUS4 MOS40 0191 E2F6 v22 MOS40 0263 E325 18 CLC MOS40 0191 E2F6 v22 MOS40 0264 E326 SAVEX5 MOS40 0191 E2F6 v22 MOS40 0265 E326 BD FC 01 LDAAX FBLOCK+FFROM-MINUS4 MOS40 0191 E2F6 v22 MOS40 0266 E329 7D 00 02 ADCAX FBLOCK+FTO-MINUS4 MOS40 0191 E2F6 v22 MOS40 0267 E32C 9D 00 02 STAAX FBLOCK+FTO-MINUS4 MOS40 0191 E2F6 v22 MOS40 0268 E32F E8 INX MOS40 0191 E2F6 v22 MOS40 0269 E330 D0 F4 BNE SAVEX5 ;[execute loop four times] MOS40 0191 E2F6 v22 MOS40 0270 E332 SAVEX4 ;copy 'from' address to execute and load fields MOS40 0191 E2F6 v22 MOS40 0271 E332 A2 03 LDXIM &03 MOS40 0191 E2F6 v22 MOS40 0272 E334 SAVEX1 MOS40 0191 E2F6 v22 MOS40 0273 E334 BD F8 02 LDAAX FBLOCK+FFROM MOS40 0191 E2F6 v22 MOS40 0274 E337 9D F4 02 STAAX FBLOCK+FEXEC MOS40 0191 E2F6 v22 MOS40 0275 E33A 9D F0 02 STAAX FBLOCK+FLOAD MOS40 0191 E2F6 v22 MOS40 0276 E33D CA DEX MOS40 0191 E2F6 v22 MOS40 0277 E33E 10 F4 BPL SAVEX1 MOS40 0191 E2F6 v22 MOS40 0278 E340 ; check if exec address present MOS40 0191 E2F6 v22 MOS40 0279 E340 28 PLP MOS40 0191 E2F6 v22 MOS40 0280 E341 F0 BE BEQ LS0 ;[no exec address] MOS40 0191 E2F6 v22 MOS40 0281 E343 ; read exec address MOS40 0191 E2F6 v22 MOS40 0282 E343 A2 06 LDXIM FEXEC MOS40 0191 E2F6 v22 MOS40 0283 E345 20 70 E2 JSR LSA MOS40 0191 E2F6 v22 MOS40 0284 E348 90 0B BCC BADFX ;[expected exec address not found] MOS40 0191 E2F6 v22 MOS40 0285 E34A F0 B5 BEQ LS0 ;[no following load address] MOS40 0191 E2F6 v22 MOS40 0286 E34C ; read load address MOS40 0191 E2F6 v22 MOS40 0287 E34C A2 02 LDXIM FLOAD MOS40 0191 E2F6 v22 MOS40 0288 E34E 20 70 E2 JSR LSA MOS40 0191 E2F6 v22 MOS40 0289 E351 90 02 BCC BADFX ;[expected load address not found] MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 82 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0191 E2F6 v22 MOS40 0290 E353 F0 AC BEQ LS0 ;[good line termination] MOS40 0191 E2F6 v22 MOS40 0291 E355 BADFX MOS40 0191 E2F6 v22 MOS40 0292 E355 MBDCMD MOS40 0191 E2F6 v22 MOS40 0293 E355 00 BRK ;report error 'Bad command' MOS40 0389 E39E ^35 MOS40 0294 E356 FE = BADCMD MOS40 0389 E39E ^35 MOS40 0295 E357 42 61 64 = "Bad command" MOS40 0389 E39E ^35 MOS40 0296 E362 00 BADKEY BRK ;report error 'Bad KEY' / end of preceeding error message MOS40 0444 E3CC ^14 MOS40 0297 E363 FB = BADKY MOS40 0444 E3CC ^14 MOS40 0298 E364 42 61 64 = "Bad key" MOS40 0444 E3CC ^14 MOS40 0299 E36B 00 = ZERO ;message terminator MOS40 0444 E3CC ^14 MOS40 0300 E36C MOS40 0444 E3CC ^14 MOS40 0301 E36C [ MOS125 = &FF MOS40 0444 E3CC ^14 MOS40 0333 E36C ] MOS40 0444 E3CC ^14 MOS40 0334 E36C MOS40 0444 E3CC ^14 MOS40 0335 E36C MOS40 0444 E3CC ^14 MOS40 0336 E36C MOS40 0444 E3CC ^14 MOS40 0337 E36C FX ;*FX x,y MOS40 0444 E3CC ^14 MOS40 0338 E36C 20 A7 E0 JSR GETNUM ;read FX function code MOS40 0444 E3CC ^14 MOS40 0339 E36F 90 E4 BCC BADFX ;[bad FX number] MOS40 0444 E3CC ^14 MOS40 0340 E371 ; MOS40 0444 E3CC ^14 MOS40 0341 E371 ; N.B. C=1 MOS40 0444 E3CC ^14 MOS40 0342 E371 ; push function code MOS40 0444 E3CC ^14 MOS40 0343 E371 ; MOS40 0444 E3CC ^14 MOS40 0344 E371 8A TXA MOS40 0444 E3CC ^14 MOS40 0345 E372 FXN ;entry point used by CLI, C=0 MOS40 0444 E3CC ^14 MOS40 0346 E372 48 PHA MOS40 0444 E3CC ^14 MOS40 0347 E373 A9 00 LDAIM ZERO ;set default argument values MOS40 0444 E3CC ^14 MOS40 0348 E375 85 E5 STA FXREGX MOS40 0444 E3CC ^14 MOS40 0349 E377 85 E4 STA FXREGY MOS40 0444 E3CC ^14 MOS40 0350 E379 ; MOS40 0444 E3CC ^14 MOS40 0351 E379 ; check for line end MOS40 0444 E3CC ^14 MOS40 0352 E379 ; MOS40 0444 E3CC ^14 MOS40 0353 E379 20 9C E0 JSR SKPCM ;N.B. C=0 => just check for line end MOS40 0444 E3CC ^14 MOS40 0354 E37C ; MOS40 0444 E3CC ^14 MOS40 0355 E37C ; C=1 => skip an optional comma and check for line end MOS40 0444 E3CC ^14 MOS40 0356 E37C ; MOS40 0444 E3CC ^14 MOS40 0357 E37C F0 18 BEQ FX1 ;[line end, just a function code] MOS40 0444 E3CC ^14 MOS40 0358 E37E ; MOS40 0444 E3CC ^14 MOS40 0359 E37E ; try reading another argument MOS40 0444 E3CC ^14 MOS40 0360 E37E ; MOS40 0444 E3CC ^14 MOS40 0361 E37E 20 A7 E0 JSR GETNUM MOS40 0444 E3CC ^14 MOS40 0362 E381 90 D2 BCC BADFX ;[bad FX number] MOS40 0444 E3CC ^14 MOS40 0363 E383 ; MOS40 0444 E3CC ^14 MOS40 0364 E383 ; N.B. C=1 MOS40 0444 E3CC ^14 MOS40 0365 E383 ; MOS40 0444 E3CC ^14 MOS40 0366 E383 86 E5 STX FXREGX MOS40 0444 E3CC ^14 MOS40 0367 E385 ; MOS40 0444 E3CC ^14 MOS40 0368 E385 ; check for line end MOS40 0444 E3CC ^14 MOS40 0369 E385 ; MOS40 0444 E3CC ^14 MOS40 0370 E385 20 9E E0 JSR SKPCOM MOS40 0444 E3CC ^14 MOS40 0371 E388 F0 0C BEQ FX1 MOS40 0444 E3CC ^14 MOS40 0372 E38A ; MOS40 0444 E3CC ^14 MOS40 0373 E38A ; try reading another argument MOS40 0444 E3CC ^14 MOS40 0374 E38A ; MOS40 0444 E3CC ^14 MOS40 0375 E38A 20 A7 E0 JSR GETNUM MOS40 0444 E3CC ^14 MOS40 0376 E38D 90 C6 BCC BADFX ;[bad FX number] MOS40 0444 E3CC ^14 MOS40 0377 E38F 86 E4 STX FXREGY MOS40 0444 E3CC ^14 MOS40 0378 E391 ; MOS40 0444 E3CC ^14 MOS40 0379 E391 ; ensure line end MOS40 0444 E3CC ^14 MOS40 0380 E391 ; MOS40 0444 E3CC ^14 MOS40 0381 E391 20 93 E0 JSR SKIPSP MOS40 0444 E3CC ^14 MOS40 0382 E394 D0 BF BNE BADFX ;[bad command termination] MOS40 0444 E3CC ^14 MOS40 0383 E396 ; MOS40 0444 E3CC ^14 MOS40 0384 E396 FX1 MOS40 0444 E3CC ^14 MOS40 0385 E396 A4 E4 LDY FXREGY ;load OSBYTE arguments MOS40 0444 E3CC ^14 MOS40 0386 E398 A6 E5 LDX FXREGX MOS40 0444 E3CC ^14 MOS40 0387 E39A 68 PLA MOS40 0444 E3CC ^14 MOS40 0388 E39B 20 F4 FF JSR OSBYTE MOS40 0444 E3CC ^14 MOS40 0389 E39E 70 B5 BVS BADFX ;[unrecognised FX code] MOS40 0444 E3CC ^14 MOS40 0390 E3A0 [ MOS125 = &FF MOS40 0444 E3CC ^14 MOS40 0391 E3A0 | MOS40 0444 E3CC ^14 MOS40 0392 E3A0 KEYZAP MOS40 0444 E3CC ^14 MOS40 0393 E3A0 ] MOS40 0444 E3CC ^14 MOS40 0394 E3A0 60 RTS MOS40 0444 E3CC ^14 MOS40 0395 E3A1 MOS40 0444 E3CC ^14 MOS40 0396 E3A1 MOS40 0444 E3CC ^14 MOS40 0397 E3A1 [ MOS125 = &FF MOS40 0444 E3CC ^14 MOS40 0398 E3A1 | MOS40 0444 E3CC ^14 MOS40 0399 E3A1 KEY ;KEY MOS40 0444 E3CC ^14 MOS40 0400 E3A1 20 A7 E0 JSR GETNUM MOS40 0444 E3CC ^14 MOS40 0401 E3A4 90 BC BCC BADKEY ;[bad soft key number (>255)] MOS40 0444 E3CC ^14 MOS40 0402 E3A6 ; A = character delimiting number MOS40 0444 E3CC ^14 MOS40 0403 E3A6 ; X = NUMBER = CSKEY = key number MOS40 0444 E3CC ^14 MOS40 0404 E3A6 ; Y = soft key number argument MOS40 0444 E3CC ^14 MOS40 0405 E3A6 ; check soft key number range MOS40 0444 E3CC ^14 MOS40 0406 E3A6 E0 10 CPXIM NSOFTK MOS40 0444 E3CC ^14 MOS40 0407 E3A8 B0 B8 BCS BADKEY ;[soft_key_number > number of soft keys - 1] MOS40 0444 E3CC ^14 MOS40 0408 E3AA ; key number in range 0 to NSOFTK-1 MOS40 0444 E3CC ^14 MOS40 0409 E3AA ; MOS40 0444 E3CC ^14 MOS40 0410 E3AA [ FALSE=0 MOS40 0444 E3CC ^14 MOS40 0413 E3AA ] MOS40 0444 E3CC ^14 MOS40 0414 E3AA ; MOS40 0444 E3CC ^14 MOS40 0415 E3AA 20 9E E0 JSR SKPCOM ;skip optional spaces and an optional comma MOS40 0444 E3CC ^14 MOS40 0416 E3AD 08 PHP ;save line end status MOS40 0444 E3CC ^14 MOS40 0417 E3AE AE 10 0B LDX SKEND ;Y points to unused portion of soft key buffer area MOS40 0444 E3CC ^14 MOS40 0418 E3B1 ; (set to reset SKNEND as it might have been set as a result MOS40 0444 E3CC ^14 MOS40 0419 E3B1 ; of a 'KEY in use' error) MOS40 0444 E3CC ^14 MOS40 0420 E3B1 98 TYA MOS40 0444 E3CC ^14 MOS40 0421 E3B2 48 PHA MOS40 0444 E3CC ^14 MOS40 0422 E3B3 20 15 E4 JSR SKGCR ;delete soft key (uses value in X) MOS40 0444 E3CC ^14 MOS40 0423 E3B6 ; on exit X = SKEND MOS40 0444 E3CC ^14 MOS40 0424 E3B6 68 PLA MOS40 0444 E3CC ^14 MOS40 0425 E3B7 A8 TAY MOS40 0444 E3CC ^14 MOS40 0426 E3B8 28 PLP ;restore line end status MOS40 0444 E3CC ^14 MOS40 0427 E3B9 F0 E5 BEQ KEYZAP ; end of line - specified soft key value value has been deleted so return MOS40 0444 E3CC ^14 MOS40 0428 E3BB ] MOS40 0444 E3CC ^14 MOS40 0429 E3BB CLI1 MOS40 0444 E3CC ^14 MOS40 0430 E3BB 38 SEC MOS40 0444 E3CC ^14 MOS40 0431 E3BC 20 79 EA JSR GSINTS ;initialise for reading quoted string MOS40 0444 E3CC ^14 MOS40 0432 E3BF CLIWP MOS40 0444 E3CC ^14 MOS40 0433 E3BF 20 8A EA JSR GSREAD ;read string character MOS40 0444 E3CC ^14 MOS40 0434 E3C2 B0 08 BCS CLIY ;end of string MOS40 0444 E3CC ^14 MOS40 0435 E3C4 E8 INX MOS40 0444 E3CC ^14 MOS40 0436 E3C5 F0 9B BEQ BADKEY ;[buffer full, (N.B. buffer assumed to be 256 bytes long)] MOS40 0444 E3CC ^14 MOS40 0437 E3C7 ; buffer not full MOS40 0444 E3CC ^14 MOS40 0438 E3C7 9D 00 0B STAAX SKBUF -&01 ;store character in soft key buffer MOS40 0444 E3CC ^14 MOS40 0439 E3CA ;(N.B. note offset of -1) MOS40 0444 E3CC ^14 MOS40 0440 E3CA 90 F3 BCC CLIWP ;[ALWAYS jump, go process next character] MOS40 0444 E3CC ^14 MOS40 0441 E3CC ; SOFT KEY FINAL CHECK TO SEE IF ANY OTHER KEY SHARES SAME MOS40 0444 E3CC ^14 MOS40 0442 E3CC ; VALUE POINTER - IF IT DOES THEN SET IT EQUAL TO SKEND MOS40 0444 E3CC ^14 MOS40 0443 E3CC CLIY MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 83 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0444 E3CC ^14 MOS40 0444 E3CC D0 94 BNE BADKEY ;[string not terminated by CR] -- MOS40 0445 E3CE ; N.B. new buffer end in X -- MOS40 0446 E3CE 08 PHP -- MOS40 0447 E3CF 78 SEI ;** DISABLE INTERRUPTS ** -- MOS40 0448 E3D0 20 15 E4 JSR SKGCR ;delete old soft key and replace with new value (uses value in X) -- MOS40 0449 E3D3 ;N.B. sets Y to specified soft key number -- MOS40 0450 E3D3 A2 10 LDXIM NSOFTK ;X to be roving soft key number -- MOS40 0451 E3D5 CLIYP -- MOS40 0452 E3D5 E4 E6 CPX CSKEY MOS40 0461 E3E8 ^6B MOS40 0453 E3D7 F0 0E BEQ CLIYQ ;[do not process specified soft key] MOS40 0461 E3E8 ^6B MOS40 0454 E3D9 BD 00 0B LDAAX SKPTR MOS40 0461 E3E8 ^6B MOS40 0455 E3DC D9 00 0B CMPAY SKPTR ;compare soft key buffer pointers MOS40 0461 E3E8 ^6B MOS40 0456 E3DF D0 06 BNE CLIYQ ;[pointers differ] MOS40 0461 E3E8 ^6B MOS40 0457 E3E1 AD 10 0B LDA SKEND MOS40 0461 E3E8 ^6B MOS40 0458 E3E4 9D 00 0B STAAX SKPTR ;update soft key buffer pointer MOS40 0461 E3E8 ^6B MOS40 0459 E3E7 CLIYQ MOS40 0461 E3E8 ^6B MOS40 0460 E3E7 CA DEX MOS40 0461 E3E8 ^6B MOS40 0461 E3E8 10 EB BPL CLIYP ;[go process next soft key] -- MOS40 0462 E3EA 28 PLP ;** ENABLE INTERRUPTS ** -- MOS40 0463 E3EB 60 RTS -- MOS40 0464 E3EC -- MOS40 0465 E3EC -- MOS40 0466 E3EC SKSIZE ;A := size of soft key given by Y -- MOS40 0467 E3EC ; ** THIS MODULE DISABLES INTERRUPTS ** -- MOS40 0468 E3EC ; this routine is called by soft key set (via *KEY command) -- MOS40 0469 E3EC ; and soft key read (via RDCH processing). -- MOS40 0470 E3EC ; the choice is to duplicate the code, using a distinct work slot, -- MOS40 0471 E3EC ; or share the code within a critical region in order that SKSZWK -- MOS40 0472 E3EC ; may be shared -- MOS40 0473 E3EC 08 PHP ;save interrupt state -- MOS40 0474 E3ED 78 SEI ;** DISABLE INTERRUPTS ** -- MOS40 0475 E3EE AD 10 0B LDA SKEND -- MOS40 0476 E3F1 38 SEC -- MOS40 0477 E3F2 F9 00 0B SBCAY SKPTR -- MOS40 0478 E3F5 85 FB STA SKSZWK ;SKSZWK := number of bytes to end of buffer -- MOS40 0479 E3F7 8A TXA -- MOS40 0480 E3F8 48 PHA ;push X -- MOS40 0481 E3F9 A2 10 LDXIM NSOFTK ;X is roving soft key number -- MOS40 0482 E3FB SKS1 -- MOS40 0483 E3FB BD 00 0B LDAAX SKPTR MOS40 0492 E40D ^6C MOS40 0484 E3FE 38 SEC MOS40 0492 E40D ^6C MOS40 0485 E3FF F9 00 0B SBCAY SKPTR ;A := length of soft key w.r.t. specified soft key MOS40 0492 E40D ^6C MOS40 0486 E402 90 08 BCC SKS2 ;[ignore negative length] MOS40 0492 E40D ^6C MOS40 0487 E404 F0 06 BEQ SKS2 ;[ignore zero length] MOS40 0492 E40D ^6C MOS40 0488 E406 C5 FB CMP SKSZWK MOS40 0492 E40D ^6C MOS40 0489 E408 B0 02 BCS SKS2 ;[this length >= past lengths] MOS40 0492 E40D ^6C MOS40 0490 E40A 85 FB STA SKSZWK ;remember new minimum length MOS40 0492 E40D ^6C MOS40 0491 E40C CA SKS2 DEX MOS40 0492 E40D ^6C MOS40 0492 E40D 10 EC BPL SKS1 ;[go process next soft key] -- MOS40 0493 E40F 68 PLA -- MOS40 0494 E410 AA TAX ;restore X -- MOS40 0495 E411 A5 FB LDA SKSZWK -- MOS40 0496 E413 28 PLP ;** RESTORE INTERRUPT STATE ** -- MOS40 0497 E414 ; A := length of soft key string -- MOS40 0498 E414 ; Y := soft key number given on entry -- MOS40 0499 E414 60 RTS -- MOS40 0500 E415 -- MOS40 0501 E415 -- MOS40 0502 E415 ; SOFT KEY BUFFER GARBAGE COLLECTION ROUTINE.STRING -- MOS40 0503 E415 ; FOR KEY NUMBER GIVEN IN 'CSKEY' IS DELETED & ALL -- MOS40 0504 E415 ; POINTERS ADJUSTED ACC -- MOS40 0505 E415 SKGCR ;delete (and insert) key value(s) -- MOS40 0506 E415 ;** THIS MODULE DISABLES INTERRUPTS ** -- MOS40 0507 E415 08 PHP ;** SAVE INTERRUPT STATE OF CALLER ** -- MOS40 0508 E416 78 SEI ;** DISABLE INTERRUPTS ** -- MOS40 0509 E417 ; save new end address -- MOS40 0510 E417 8A TXA -- MOS40 0511 E418 48 PHA -- MOS40 0512 E419 A4 E6 LDY CSKEY ;Y is specified soft key number -- MOS40 0513 E41B 20 EC E3 JSR SKSIZE ;A := length of soft key string -- MOS40 0514 E41E ; NOW SKSZWK = LENGTH OF CURRENT SK STRING -- MOS40 0515 E41E ; SO SETUP FOR DELETING THIS STRING. -- MOS40 0516 E41E B9 00 0B LDAAY SKPTR -- MOS40 0517 E421 A8 TAY ;Y points to specified soft key string -- MOS40 0518 E422 18 CLC -- MOS40 0519 E423 65 FB ADC SKSZWK -- MOS40 0520 E425 AA TAX ;X points to start of byte area to be moved down -- MOS40 0521 E426 85 FA STA KEYSV -- MOS40 0522 E428 ; TO AVOID MASHING POINTER STRUCTURE IF -- MOS40 0523 E428 ; MACHINE CRASHES ELSEWHERE,IT IS ESSENTIAL -- MOS40 0524 E428 ; THAT INTERRUPTS ARE *OFF* FOR THIS NEXT BIT -- MOS40 0525 E428 ; before altering the data structure, check that a soft key -- MOS40 0526 E428 ; is not being used by RDCH -- MOS40 0527 E428 AD 68 02 LDA SOFKL ;A := length of soft key in use by RDCH -- MOS40 0528 E42B F0 0D BEQ SK3 ;[no soft key in use] MOS40 0528 E42B v72 MOS40 0529 E42D ; soft key being 'unwound' by RDCH MOS40 0528 E42B v72 MOS40 0530 E42D ; N.B. altering the data structure would confuse RDCH MOS40 0528 E42B v72 MOS40 0531 E42D 00 BRK ;report error 'KEY in use' MOS40 0528 E42B v72 MOS40 0532 E42E FA = KEYUSE MOS40 0528 E42B v72 MOS40 0533 E42F 4B 65 79 = "Key in use" MOS40 0528 E42B v72 MOS40 0534 E439 00 = ZERO ;end of error message MOS40 0528 E42B v72 MOS40 0535 E43A MOS40 0528 E42B v72 MOS40 0536 E43A SK3 MOS40 0528 E42B v72 MOS40 0537 E43A CE 84 02 DEC USKFLG ;indicate update of soft keys in progress (USKFLG<>0) -- MOS40 0538 E43D 68 PLA ;A := new end of buffer -- MOS40 0539 E43E 38 SEC -- MOS40 0540 E43F E5 FA SBC KEYSV -- MOS40 0541 E441 85 FA STA KEYSV ;KEYSV := number of bytes to copy -- MOS40 0542 E443 F0 0C BEQ SKGCV ;[zero bytes to copy] MOS40 0542 E443 v73 MOS40 0543 E445 SKGCS MOS40 0542 E443 v73 MOS40 0544 E445 BD 01 0B LDAAX SKBUF ;*MOVE MOS40 0542 E443 v73 MOS40 0545 E448 99 01 0B STAAY SKBUF ;*CHARACTERS MOS40 0542 E443 v73 MOS40 0546 E44B C8 INY MOS40 0542 E443 v73 MOS40 0547 E44C E8 INX MOS40 0542 E443 v73 MOS40 0548 E44D C6 FA DEC KEYSV MOS40 0542 E443 v73 MOS40 0549 E44F D0 F4 BNE SKGCS ;[more bytes to copy] MOS40 0542 E443 v73 MOS40 0550 E451 ; NOW ADJUST ALL POINTERS WHICH ARE GREATER MOS40 0542 E443 v73 MOS40 0551 E451 ; THAN THE ONE AT CSKEY. MOS40 0542 E443 v73 MOS40 0552 E451 SKGCV MOS40 0542 E443 v73 MOS40 0553 E451 ; save new end address MOS40 0542 E443 v73 MOS40 0554 E451 98 TYA -- MOS40 0555 E452 48 PHA -- MOS40 0556 E453 A4 E6 LDY CSKEY ;Y is specified soft key number -- MOS40 0557 E455 A2 10 LDXIM NSOFTK ;X is roving soft key number, including end pointer -- MOS40 0558 E457 SKGCT -- MOS40 0559 E457 BD 00 0B LDAAX SKPTR MOS40 0573 E467 ^6E MOS40 0560 E45A D9 00 0B CMPAY SKPTR MOS40 0573 E467 ^6E MOS40 0561 E45D 90 07 BCC SKGCU ;[current pointer precedes specified pointer] MOS40 0573 E467 ^6E MOS40 0562 E45F [ TRUE=0 MOS40 0573 E467 ^6E MOS40 0563 E45F F0 05 BEQ SKGCU ;[current pointer equals specified pointer] MOS40 0573 E467 ^6E MOS40 0564 E461 ] MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 84 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0573 E467 ^6E MOS40 0565 E461 ; current pointer is beyond specified pointer MOS40 0573 E467 ^6E MOS40 0566 E461 ; if pointers are equal then specified soft key was null ... MOS40 0573 E467 ^6E MOS40 0567 E461 ; ... therefore its size was zero and a drop thru is a no-operation MOS40 0573 E467 ^6E MOS40 0568 E461 ; C=1 MOS40 0573 E467 ^6E MOS40 0569 E461 E5 FB SBC SKSZWK ;C already 1 MOS40 0573 E467 ^6E MOS40 0570 E463 9D 00 0B STAAX SKPTR ;adjust current buffer pointer MOS40 0573 E467 ^6E MOS40 0571 E466 SKGCU MOS40 0573 E467 ^6E MOS40 0572 E466 CA DEX MOS40 0573 E467 ^6E MOS40 0573 E467 10 EE BPL SKGCT ;[go process next soft key] -- MOS40 0574 E469 ; NOW UPDATE CURRENT KEY POINTER -- MOS40 0575 E469 AD 10 0B LDA SKEND -- MOS40 0576 E46C 99 00 0B STAAY SKPTR ;adjust specified soft key pointer to point to end of buffer -- MOS40 0577 E46F 68 PLA ;A := new end address -- MOS40 0578 E470 8D 10 0B STA SKEND ;make end buffer pointers equal -- MOS40 0579 E473 AA TAX ;X := new end of buffer pointer -- MOS40 0580 E474 EE 84 02 INC USKFLG ;indicate update of soft keys over (USKFLG=0) -- MOS40 0581 E477 28 PLP ;** RESTORE INTERRUPT STATE OF CALLER ** -- MOS40 0582 E478 ; X = SKEND -- MOS40 0583 E478 ; Y = specified soft key number -- MOS40 0584 E478 60 RTS -- MOS40 0585 E479 LNK MOS42 -- MOS42 0001 E479 -- MOS42 0002 E479 ; > MOS42 -- MOS42 0003 E479 TTL MOS42 Buffer management -- MOS42 0004 E479 OPT MOS42 MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 85 MOS42 MOS42 Buffer management MOS42 -- MOS42 0005 E479 ;(c) 1981 ACORN Computers Limited -- MOS42 0006 E479 ;BBC Microcomputer Machine Operating System (MOS) -- MOS42 0007 E479 ;Change record: -- MOS42 0008 E479 ;201 01-May-82 PB EVENT restores A -- MOS42 0009 E479 ;004 29-Jul-81 MP Prototype version -- MOS42 0010 E479 ;Author(s): -- MOS42 0011 E479 ;PB Paul Bond -- MOS42 0012 E479 ;MP Mike Prees -- MOS42 0013 E479 ; buffer address table (hi byte) -- MOS42 0014 E479 BFADHI -- MOS42 0015 E479 03 = /(RDCHBF+RDCHSZ-&0100 ) -- MOS42 0016 E47A 0A = /(RSRIBF+RSRISZ-&0100 ) -- MOS42 0017 E47B 08 = /(RSROBF+RSROSZ-&0100 ) -- MOS42 0018 E47C 07 = /(PRNBF+PRNSZ-&0100 ) -- MOS42 0019 E47D 07 = /(SNDBF1+SBSIZE-&0100 ) -- MOS42 0020 E47E 07 = /(SNDBF2+SBSIZE-&0100 ) -- MOS42 0021 E47F 07 = /(SNDBF3+SBSIZE-&0100 ) -- MOS42 0022 E480 07 = /(SNDBF4+SBSIZE-&0100 ) -- MOS42 0023 E481 09 = /(SPCHBF+SPCHSZ-&0100 ) -- MOS42 0024 E482 ; buffer address table (lo byte) -- MOS42 0025 E482 BFADLO -- MOS42 0026 E482 00 = RDCHBF+RDCHSZ-&0100 ;RDCH (keyboard) buffer -- MOS42 0027 E483 00 = RSRIBF+RSRISZ-&0100 ;RS423 input -- MOS42 0028 E484 C0 = RSROBF+RSROSZ-&0100 ;RS423 output -- MOS42 0029 E485 C0 = PRNBF+PRNSZ-&0100 ;print -- MOS42 0030 E486 50 = SNDBF1+SBSIZE-&0100 ;sound channel 1 -- MOS42 0031 E487 60 = SNDBF2+SBSIZE-&0100 ;sound channel 2 -- MOS42 0032 E488 70 = SNDBF3+SBSIZE-&0100 ;sound channel 3 -- MOS42 0033 E489 80 = SNDBF4+SBSIZE-&0100 ;sound channel 4 -- MOS42 0034 E48A 00 = SPCHBF+SPCHSZ-&0100 ;speech -- MOS42 0035 E48B ; buffer origin offsets within page -- MOS42 0036 E48B BFORG -- MOS42 0037 E48B E0 = &0100-RDCHSZ -- MOS42 0038 E48C 00 = &0100-RSRISZ -- MOS42 0039 E48D 40 = &0100-RSROSZ -- MOS42 0040 E48E C0 = &0100-PRNSZ -- MOS42 0041 E48F F0 = &0100-SBSIZE -- MOS42 0042 E490 F0 = &0100-SBSIZE -- MOS42 0043 E491 F0 = &0100-SBSIZE -- MOS42 0044 E492 F0 = &0100-SBSIZE -- MOS42 0045 E493 C0 = &0100-SPCHSZ -- MOS42 0046 E494 ; general buffer manipulation routines -- MOS42 0047 E494 SETBUF -- MOS42 0048 E494 ; set buffer pointer -- MOS42 0049 E494 BD 82 E4 LDAAX BFADLO -- MOS42 0050 E497 85 FA STA BUFFLO -- MOS42 0051 E499 BD 79 E4 LDAAX BFADHI -- MOS42 0052 E49C 85 FB STA BUFFHI -- MOS42 0053 E49E 60 RTS -- MOS42 0054 E49F -- MOS42 0055 E49F -- MOS42 0056 E49F EXAM ;examine character in buffer -- MOS42 0057 E49F 2C 49 D9 BIT FFBYT ;V=1 => examine option -- MOS42 0058 E4A2 70 01 BVS EXAM1 ;[ALWAYS jump] MOS42 0058 E4A2 v7E MOS42 0059 E4A4 ; NEVER fall thru MOS42 0058 E4A2 v7E MOS42 0060 E4A4 REMOV ;remove character from buffer MOS42 0058 E4A2 v7E MOS42 0061 E4A4 B8 CLV ;V=0 => indicate remove option MOS42 0058 E4A2 v7E MOS42 0062 E4A5 ; X = buffer index MOS42 0058 E4A2 v7E MOS42 0063 E4A5 ; V=0 => remove, V=1 => examine MOS42 0058 E4A2 v7E MOS42 0064 E4A5 EXAM1 ;entered with V=1 MOS42 0058 E4A2 v7E MOS42 0065 E4A5 ; MOS42 0058 E4A2 v7E MOS42 0066 E4A5 6C 2C 02 JMI REMVEC ;use indirection (defaults to REM) -- MOS42 0067 E4A8 ; -- MOS42 0068 E4A8 REM -- MOS42 0069 E4A8 [ $Tutu -- MOS42 0072 E4A8 | -- MOS42 0073 E4A8 ; disable interrupts -- MOS42 0074 E4A8 08 PHP -- MOS42 0075 E4A9 78 SEI -- MOS42 0076 E4AA ] -- MOS42 0077 E4AA ; get buffer start pointer -- MOS42 0078 E4AA BD D8 02 LDAAX BFSTRT -- MOS42 0079 E4AD DD E1 02 CMPAX BFEND -- MOS42 0080 E4B0 F0 72 BEQ REMOV1 MOS42 0080 E4B0 v0D MOS42 0081 E4B2 A8 TAY ;Y := buffer start pointer MOS42 0080 E4B0 v0D MOS42 0082 E4B3 ; set buffer pointer MOS42 0080 E4B0 v0D MOS42 0083 E4B3 20 94 E4 JSR SETBUF MOS42 0080 E4B0 v0D MOS42 0084 E4B6 ; remove character from buffer MOS42 0080 E4B0 v0D MOS42 0085 E4B6 B1 FA LDAIY BUFFLO MOS42 0080 E4B0 v0D MOS42 0086 E4B8 70 1B BVS REMOV3 ;[examine option, exit with character] MOS42 0080 E4B0 v0D MOS42 0087 E4BA 48 PHA ;push character MOS42 0080 E4B0 v0D MOS42 0088 E4BB ; update buffer start pointer MOS42 0080 E4B0 v0D MOS42 0089 E4BB C8 INY MOS42 0080 E4B0 v0D MOS42 0090 E4BC 98 TYA MOS42 0080 E4B0 v0D MOS42 0091 E4BD D0 03 BNE REMOV2 MOS42 0080 E4B0 v0D MOS42 0092 E4BF ; wraparound MOS42 0080 E4B0 v0D MOS42 0093 E4BF BD 8B E4 LDAAX BFORG MOS42 0080 E4B0 v0D MOS42 0094 E4C2 REMOV2 MOS42 0080 E4B0 v0D MOS42 0095 E4C2 9D D8 02 STAAX BFSTRT MOS42 0080 E4B0 v0D MOS42 0096 E4C5 ; check for removal of last character in buffer MOS42 0080 E4B0 v0D MOS42 0097 E4C5 ; N.B. this code is only executed for the remove option MOS42 0080 E4B0 v0D MOS42 0098 E4C5 E0 02 CPXIM OUTPUT MOS42 0080 E4B0 v0D MOS42 0099 E4C7 90 0A BCC REMOV4 ;[input buffer, buffer empty event not applicable] MOS42 0080 E4B0 v0D MOS42 0100 E4C9 DD E1 02 CMPAX BFEND MOS42 0080 E4B0 v0D MOS42 0101 E4CC D0 05 BNE REMOV4 ;[not last character] MOS42 0080 E4B0 v0D MOS42 0102 E4CE ; signal buffer empty event MOS42 0080 E4B0 v0D MOS42 0103 E4CE A0 00 LDYIM EVMPTY MOS42 0080 E4B0 v0D MOS42 0104 E4D0 20 D8 E4 JSR EVENT MOS42 0080 E4B0 v0D MOS42 0105 E4D3 REMOV4 MOS42 0080 E4B0 v0D MOS42 0106 E4D3 68 PLA ;restore character read MOS42 0080 E4B0 v0D MOS42 0107 E4D4 A8 TAY ;Y := character MOS42 0080 E4B0 v0D MOS42 0108 E4D5 REMOV3 ;return with C=0 indicating removal successful MOS42 0080 E4B0 v0D MOS42 0109 E4D5 28 PLP ;restore interrupt state MOS42 0080 E4B0 v0D MOS42 0110 E4D6 18 CLC MOS42 0080 E4B0 v0D MOS42 0111 E4D7 60 RTS MOS42 0080 E4B0 v0D MOS42 0112 E4D8 MOS42 0080 E4B0 v0D MOS42 0113 E4D8 MOS42 0080 E4B0 v0D MOS42 0114 E4D8 EVENT ;signal event given by Y, optional arguments given in A & X MOS42 0080 E4B0 v0D MOS42 0115 E4D8 ; this routine must not corrupt A MOS42 0080 E4B0 v0D MOS42 0116 E4D8 08 PHP MOS42 0080 E4B0 v0D MOS42 0117 E4D9 78 SEI MOS42 0080 E4B0 v0D MOS42 0118 E4DA 48 PHA ;save A MOS42 0080 E4B0 v0D MOS42 0119 E4DB 85 FA STA EVENTA ;save A MOS42 0080 E4B0 v0D MOS42 0120 E4DD B9 BF 02 LDAAY EVENTS MOS42 0080 E4B0 v0D MOS42 0121 E4E0 F0 41 BEQ EVENT0 ;[event disabled] MOS42 0080 E4B0 v0D MOS42 0122 E4E2 ; event enabled, call event routine MOS42 0080 E4B0 v0D MOS42 0123 E4E2 98 TYA ;A = event code MOS42 0080 E4B0 v0D MOS42 0124 E4E3 A4 FA LDY EVENTA ;Y := argument passed originally in A MOS42 0080 E4B0 v0D MOS42 0125 E4E5 20 67 F0 JSR JMIEVT ;A = event code, must not corrupt X MOS42 0080 E4B0 v0D MOS42 0126 E4E8 68 PLA ;restore A MOS42 0080 E4B0 v0D MOS42 0127 E4E9 28 PLP MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 86 MOS42 MOS42 Buffer management MOS42 MOS42 0080 E4B0 v0D MOS42 0128 E4EA 18 CLC ;indicate event was enabled MOS42 0080 E4B0 v0D MOS42 0129 E4EB 60 RTS MOS42 0080 E4B0 v0D MOS42 0130 E4EC MOS42 0080 E4B0 v0D MOS42 0131 E4EC CKESCY ;insert character in Y into buffer MOS42 0080 E4B0 v0D MOS42 0132 E4EC ; MOS42 0080 E4B0 v0D MOS42 0133 E4EC ; signal input event MOS42 0080 E4B0 v0D MOS42 0134 E4EC ; MOS42 0080 E4B0 v0D MOS42 0135 E4EC 98 TYA ;A := character MOS42 0080 E4B0 v0D MOS42 0136 E4ED A0 02 LDYIM EVKYBD MOS42 0080 E4B0 v0D MOS42 0137 E4EF 20 D8 E4 JSR EVENT ;assumes A and X not corrupted MOS42 0080 E4B0 v0D MOS42 0138 E4F2 A8 TAY MOS42 0080 E4B0 v0D MOS42 0139 E4F3 INSERT ;FX call to insert character into buffer MOS42 0080 E4B0 v0D MOS42 0140 E4F3 98 TYA MOS42 0080 E4B0 v0D MOS42 0141 E4F4 INSRT ;insert character into buffer MOS42 0080 E4B0 v0D MOS42 0142 E4F4 ; MOS42 0080 E4B0 v0D MOS42 0143 E4F4 6C 2A 02 JMI INSVEC ;use indirection (defaults to INS) MOS42 0080 E4B0 v0D MOS42 0144 E4F7 ; MOS42 0080 E4B0 v0D MOS42 0145 E4F7 INS MOS42 0080 E4B0 v0D MOS42 0146 E4F7 ; A = character MOS42 0080 E4B0 v0D MOS42 0147 E4F7 ; X = buffer index MOS42 0080 E4B0 v0D MOS42 0148 E4F7 [ $Tutu MOS42 0080 E4B0 v0D MOS42 0151 E4F7 | MOS42 0080 E4B0 v0D MOS42 0152 E4F7 ; disable interrupts MOS42 0080 E4B0 v0D MOS42 0153 E4F7 08 PHP MOS42 0080 E4B0 v0D MOS42 0154 E4F8 78 SEI MOS42 0080 E4B0 v0D MOS42 0155 E4F9 ] MOS42 0080 E4B0 v0D MOS42 0156 E4F9 ; save character MOS42 0080 E4B0 v0D MOS42 0157 E4F9 48 PHA MOS42 0080 E4B0 v0D MOS42 0158 E4FA ; construct buffer end offset in Y MOS42 0080 E4B0 v0D MOS42 0159 E4FA BC E1 02 LDYAX BFEND MOS42 0080 E4B0 v0D MOS42 0160 E4FD C8 INY MOS42 0080 E4B0 v0D MOS42 0161 E4FE D0 03 BNE INSRT2 MOS42 0080 E4B0 v0D MOS42 0162 E500 ; buffer wraparound MOS42 0080 E4B0 v0D MOS42 0163 E500 BC 8B E4 LDYAX BFORG MOS42 0080 E4B0 v0D MOS42 0164 E503 INSRT2 MOS42 0080 E4B0 v0D MOS42 0165 E503 98 TYA MOS42 0080 E4B0 v0D MOS42 0166 E504 DD D8 02 CMPAX BFSTRT MOS42 0080 E4B0 v0D MOS42 0167 E507 F0 0F BEQ INSRT1 ;[buffer full] MOS42 0080 E4B0 v0D MOS42 0168 E509 ; update buffer end pointer MOS42 0080 E4B0 v0D MOS42 0169 E509 BC E1 02 LDYAX BFEND MOS42 0080 E4B0 v0D MOS42 0170 E50C 9D E1 02 STAAX BFEND MOS42 0080 E4B0 v0D MOS42 0171 E50F ; construct buffer pointer MOS42 0080 E4B0 v0D MOS42 0172 E50F 20 94 E4 JSR SETBUF MOS42 0080 E4B0 v0D MOS42 0173 E512 ; store character in buffer MOS42 0080 E4B0 v0D MOS42 0174 E512 68 PLA ;A := character MOS42 0080 E4B0 v0D MOS42 0175 E513 91 FA STAIY BUFFLO MOS42 0080 E4B0 v0D MOS42 0176 E515 ; return with C=0 => insert successful MOS42 0080 E4B0 v0D MOS42 0177 E515 28 PLP ;restore interrupt state MOS42 0080 E4B0 v0D MOS42 0178 E516 18 CLC MOS42 0080 E4B0 v0D MOS42 0179 E517 60 RTS MOS42 0080 E4B0 v0D MOS42 0180 E518 MOS42 0080 E4B0 v0D MOS42 0181 E518 INSRT1 ;signal buffer full event MOS42 0080 E4B0 v0D MOS42 0182 E518 68 PLA ;restore character MOS42 0080 E4B0 v0D MOS42 0183 E519 E0 02 CPXIM OUTPUT MOS42 0080 E4B0 v0D MOS42 0184 E51B B0 07 BCS INOBUF ;[output buffer, buffer full event not applicable] MOS42 0080 E4B0 v0D MOS42 0185 E51D ; signal input buffer full event MOS42 0080 E4B0 v0D MOS42 0186 E51D A0 01 LDYIM EVFULL MOS42 0080 E4B0 v0D MOS42 0187 E51F 20 D8 E4 JSR EVENT ;A=character, X=bufferid MOS42 0080 E4B0 v0D MOS42 0188 E522 ; (N.B. does not corrupt A, should not corrupt X) MOS42 0080 E4B0 v0D MOS42 0189 E522 48 PHA ;compensate for following PLA MOS42 0080 E4B0 v0D MOS42 0190 E523 EVENT0 ;indicate event was disabled MOS42 0080 E4B0 v0D MOS42 0191 E523 68 PLA MOS42 0080 E4B0 v0D MOS42 0192 E524 INOBUF ;output buffer, buffer full event not applicable MOS42 0080 E4B0 v0D MOS42 0193 E524 REMOV1 ;return with C=1 => insert/remove failed due to buffer full/empty MOS42 0080 E4B0 v0D MOS42 0194 E524 28 PLP ;restore interrupt state MOS42 0245 E543 ^27 MOS42 0195 E525 38 SEC MOS42 0245 E543 ^27 MOS42 0196 E526 60 RTS MOS42 0245 E543 ^27 MOS42 0197 E527 MOS42 0245 E543 ^27 MOS42 0198 E527 MOS42 0245 E543 ^27 MOS42 0199 E527 CAPS ;test for an uppercase letter MOS42 0245 E543 ^27 MOS42 0200 E527 MOS42 0245 E543 ^27 MOS42 0201 E527 [ MOS125 = &FF MOS42 0245 E543 ^27 MOS42 0214 E527 | MOS42 0245 E543 ^27 MOS42 0215 E527 48 PHA MOS42 0245 E543 ^27 MOS42 0216 E528 ;Must preserve V during LOADGO->SRCH0->LOOK->CMPFT->CAPS MOS42 0245 E543 ^27 MOS42 0217 E528 ;ANDIM &DF;CMPIM "A";EORIM &FF;RORA;ADCIM "Z":SHR:1 MOS42 0245 E543 ^27 MOS42 0218 E528 ;ORAIM &20;CMPIM "z"+&01;EORIM &FF;RORA;ADCIM ("a":SHR:1):OR:&80 MOS42 0245 E543 ^27 MOS42 0219 E528 29 DF ANDIM &DF MOS42 0245 E543 ^27 MOS42 0220 E52A C9 5B CMPIM "Z"+&01 MOS42 0245 E543 ^27 MOS42 0221 E52C B0 04 BCS CAPSX MOS42 0245 E543 ^27 MOS42 0222 E52E 49 FF EORIM &FF MOS42 0245 E543 ^27 MOS42 0223 E530 C9 BF CMPIM "A"-&01:EOR:&FF MOS42 0245 E543 ^27 MOS42 0224 E532 CAPSX MOS42 0245 E543 ^27 MOS42 0225 E532 68 PLA MOS42 0245 E543 ^27 MOS42 0226 E533 ; C=0 => Pass, C=1 => Fail MOS42 0245 E543 ^27 MOS42 0227 E533 60 RTS MOS42 0245 E543 ^27 MOS42 0228 E534 ] MOS42 0245 E543 ^27 MOS42 0229 E534 MOS42 0245 E543 ^27 MOS42 0230 E534 MOS42 0245 E543 ^27 MOS42 0231 E534 RDCHS ;insert character into RDCH (keyboard) buffer MOS42 0245 E543 ^27 MOS42 0232 E534 A2 00 LDXIM BRDCH MOS42 0245 E543 ^27 MOS42 0233 E536 RNSRT MOS42 0245 E543 ^27 MOS42 0234 E536 ; insert character Y into buffer whose index is X, MOS42 0245 E543 ^27 MOS42 0235 E536 ; checking for the interrupt character (default ASCII escape) MOS42 0245 E543 ^27 MOS42 0236 E536 ; MOS42 0245 E543 ^27 MOS42 0237 E536 ; RS423 8 bit does not detect interrupt character MOS42 0245 E543 ^27 MOS42 0238 E536 8A TXA MOS42 0245 E543 ^27 MOS42 0239 E537 2D 45 02 AND RS8BIT MOS42 0245 E543 ^27 MOS42 0240 E53A D0 B7 BNE INSERT ;[RSI & RS423-8-bit, no input event] MOS42 0245 E543 ^27 MOS42 0241 E53C ; MOS42 0245 E543 ^27 MOS42 0242 E53C 98 TYA MOS42 0245 E543 ^27 MOS42 0243 E53D 4D 6C 02 EOR INTCH ;default INTCH is ESC MOS42 0245 E543 ^27 MOS42 0244 E540 0D 75 02 ORA ESCHAR ;treat as character? MOS42 0245 E543 ^27 MOS42 0245 E543 D0 A7 BNE CKESCY ;[not escape character or let escape thru, take no action] -- MOS42 0246 E545 ; -- MOS42 0247 E545 ; ESC detected - ignore ? -- MOS42 0248 E545 AD 58 02 LDA CRIT -- MOS42 0249 E548 6A RORA -- MOS42 0250 E549 98 TYA ;A := character -- MOS42 0251 E54A B0 0A BCS CLCRTS ;[ignore escape] MOS42 0251 E54A v75 MOS42 0252 E54C ; MOS42 0251 E54A v75 MOS42 0253 E54C A0 06 LDYIM EVESC MOS42 0251 E54A v75 MOS42 0254 E54E 20 D8 E4 JSR EVENT ;N.B. does not corrupt A MOS42 0251 E54A v75 MOS42 0255 E551 90 03 BCC CKESC1 ;[event was enabled, no need to take default action] MOS42 0251 E54A v75 MOS42 0256 E553 ; MOS42 0251 E54A v75 MOS42 0257 E553 ; event was disabled, so take default action MOS42 0251 E54A v75 MOS42 0258 E553 ; default escape routine MOS42 0251 E54A v75 MOS42 0259 E553 ; C=1 MOS42 0251 E54A v75 MOS42 0260 E553 20 B7 E6 JSR CESCPS ;set escape flag **** MUST USE ROUTINE CESCPS **** MOS42 0251 E54A v75 MOS42 0261 E556 CKESC1 ;character 'inserted' successfully MOS42 0251 E54A v75 MOS42 0262 E556 CLCRTS MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 87 MOS42 MOS42 Buffer management MOS42 MOS42 0251 E54A v75 MOS42 0263 E556 18 CLC -- MOS42 0264 E557 ; C=0 => character inserted OK, C=1 => character not inserted -- MOS42 0265 E557 60 RTS ;RETURN - do not insert ESC into buffer -- MOS42 0266 E558 -- MOS42 0267 E558 RDCHGX ;check for cursor option 1 -- MOS42 0268 E558 6A RORA MOS42 0367 E5A3 ^33 MOS42 0269 E559 68 PLA MOS42 0367 E5A3 ^33 MOS42 0270 E55A B0 79 BCS RDCHGCLC ;[option 1 active, return &87..&8B] MOS42 0270 E55A v06 MOS42 0271 E55C ; treat as cursor option 2 MOS42 0270 E55A v06 MOS42 0272 E55C RDCHGS ;process character as real softkey MOS42 0270 E55A v06 MOS42 0273 E55C 98 TYA ;A := character MOS42 0270 E55A v06 MOS42 0274 E55D ; MOS42 0270 E55A v06 MOS42 0275 E55D 48 PHA MOS42 0270 E55A v06 MOS42 0276 E55E 4A LSRA MOS42 0270 E55A v06 MOS42 0277 E55F 4A LSRA MOS42 0270 E55A v06 MOS42 0278 E560 4A LSRA MOS42 0270 E55A v06 MOS42 0279 E561 4A LSRA MOS42 0270 E55A v06 MOS42 0280 E562 ; MOS42 0270 E55A v06 MOS42 0281 E562 49 04 EORIM &04 ;fudge to tie in with frozen documentation MOS42 0270 E55A v06 MOS42 0282 E564 A8 TAY MOS42 0270 E55A v06 MOS42 0283 E565 ; character on stack MOS42 0270 E55A v06 MOS42 0284 E565 ; MOS42 0270 E55A v06 MOS42 0285 E565 B9 65 02 LDAAY SOFTLO-&08 MOS42 0270 E55A v06 MOS42 0286 E568 C9 01 CMPIM &01 ;test softkey range option MOS42 0270 E55A v06 MOS42 0287 E56A F0 6B BEQ GKEY ;[expand softkey] MOS42 0270 E55A v06 MOS42 0288 E56C 68 PLA ;restore character MOS42 0270 E55A v06 MOS42 0289 E56D 90 0D BCC RDCHG1 ;[ignore key] MOS42 0270 E55A v06 MOS42 0290 E56F ; return byte code MOS42 0270 E55A v06 MOS42 0291 E56F ; C=1 MOS42 0270 E55A v06 MOS42 0292 E56F 29 0F ANDIM &0F ;A := offset of soft key MOS42 0270 E55A v06 MOS42 0293 E571 18 CLC MOS42 0270 E55A v06 MOS42 0294 E572 79 65 02 ADCAY SOFTLO-&08 MOS42 0270 E55A v06 MOS42 0295 E575 MOS42 0270 E55A v06 MOS42 0296 E575 18 CLC MOS42 0270 E55A v06 MOS42 0297 E576 60 RTS ;read successful, character in A MOS42 0270 E55A v06 MOS42 0298 E577 MOS42 0270 E55A v06 MOS42 0299 E577 MOS42 0270 E55A v06 MOS42 0300 E577 RDCHGB MOS42 0270 E55A v06 MOS42 0301 E577 ; invalid character at cursor position MOS42 0270 E55A v06 MOS42 0302 E577 ; complain by transmitting BEL MOS42 0270 E55A v06 MOS42 0303 E577 20 77 E8 JSR BELL ;**** N.B. NOT THRU OSWRCH **** must restore X MOS42 0270 E55A v06 MOS42 0304 E57A 68 PLA MOS42 0270 E55A v06 MOS42 0305 E57B AA TAX ;restore X MOS42 0270 E55A v06 MOS42 0306 E57C ; get next character MOS42 0270 E55A v06 MOS42 0307 E57C ; MOS42 0270 E55A v06 MOS42 0308 E57C RDCHG1 ;process character from currently selected input buffer MOS42 0270 E55A v06 MOS42 0309 E57C 20 A4 E4 JSR REMOV ;get character from buffer MOS42 0270 E55A v06 MOS42 0310 E57F B0 55 BCS RDCHG0 ;[buffer empty, C=1] MOS42 0270 E55A v06 MOS42 0311 E581 ; MOS42 0270 E55A v06 MOS42 0312 E581 ; C=0 MOS42 0270 E55A v06 MOS42 0313 E581 ; MOS42 0270 E55A v06 MOS42 0314 E581 ; character is in A MOS42 0270 E55A v06 MOS42 0315 E581 ; MOS42 0270 E55A v06 MOS42 0316 E581 ; check whether to set RTS hi for RS423 input MOS42 0270 E55A v06 MOS42 0317 E581 ; save A MOS42 0270 E55A v06 MOS42 0318 E581 48 PHA MOS42 0270 E55A v06 MOS42 0319 E582 ; MOS42 0270 E55A v06 MOS42 0320 E582 ; check for RS423 input buffer MOS42 0270 E55A v06 MOS42 0321 E582 E0 01 CPXIM BRSI MOS42 0270 E55A v06 MOS42 0322 E584 D0 06 BNE RDCHL ;[keyboard buffer, C=0] MOS42 0270 E55A v06 MOS42 0323 E586 ; MOS42 0270 E55A v06 MOS42 0324 E586 20 C3 E1 JSR RSETX ;set RHITXE if applicable MOS42 0270 E55A v06 MOS42 0325 E589 ; MOS42 0270 E55A v06 MOS42 0326 E589 A2 01 LDXIM BRSI ;restore bufferid MOS42 0270 E55A v06 MOS42 0327 E58B 38 SEC MOS42 0270 E55A v06 MOS42 0328 E58C ; MOS42 0270 E55A v06 MOS42 0329 E58C RDCHL ;do not alter RTS MOS42 0270 E55A v06 MOS42 0330 E58C ; C=0 => keyboard, C=1 => RS423 MOS42 0270 E55A v06 MOS42 0331 E58C ; MOS42 0270 E55A v06 MOS42 0332 E58C ; restore A MOS42 0270 E55A v06 MOS42 0333 E58C 68 PLA MOS42 0270 E55A v06 MOS42 0334 E58D ; MOS42 0270 E55A v06 MOS42 0335 E58D 90 05 BCC RDCHK ;[keyboard] MOS42 0270 E55A v06 MOS42 0336 E58F ; MOS42 0270 E55A v06 MOS42 0337 E58F ; RS423 MOS42 0270 E55A v06 MOS42 0338 E58F ; MOS42 0270 E55A v06 MOS42 0339 E58F AC 45 02 LDY RS8BIT MOS42 0270 E55A v06 MOS42 0340 E592 D0 41 BNE RDCHGCLC ;[let RS423 deliver 8 bit codes] MOS42 0270 E55A v06 MOS42 0341 E594 RDCHK MOS42 0270 E55A v06 MOS42 0342 E594 ; MOS42 0270 E55A v06 MOS42 0343 E594 ; test to see if it is a softkey (real or pseudo) MOS42 0270 E55A v06 MOS42 0344 E594 A8 TAY ;Y := character MOS42 0270 E55A v06 MOS42 0345 E595 10 3E BPL RDCHGCLC ;[not a soft key (top bit zero), C=0] MOS42 0270 E55A v06 MOS42 0346 E597 MOS42 0270 E55A v06 MOS42 0347 E597 [ FALSE=0 MOS42 0270 E55A v06 MOS42 0350 E597 ] MOS42 0270 E55A v06 MOS42 0351 E597 MOS42 0270 E55A v06 MOS42 0352 E597 ; character is a softkey MOS42 0270 E55A v06 MOS42 0353 E597 ; check for cursor control key MOS42 0270 E55A v06 MOS42 0354 E597 29 0F ANDIM &0F MOS42 0270 E55A v06 MOS42 0355 E599 C9 0B CMPIM MCOPY-SOFTK0 MOS42 0270 E55A v06 MOS42 0356 E59B 90 BF BCC RDCHGS ;[not a cursor control, therefore a real softkey] MOS42 0270 E55A v06 MOS42 0357 E59D ; cursor control key MOS42 0270 E55A v06 MOS42 0358 E59D ; C=1 MOS42 0270 E55A v06 MOS42 0359 E59D ; convert character to codes &87..&8B MOS42 0270 E55A v06 MOS42 0360 E59D 69 7B ADCIM &87-MCOPY+SOFTK0-&1 MOS42 0270 E55A v06 MOS42 0361 E59F 48 PHA ;save converted code, real character still in Y MOS42 0270 E55A v06 MOS42 0362 E5A0 ; there are 3 cursor options (selected by *FX4) MOS42 0270 E55A v06 MOS42 0363 E5A0 ; 0 cursor edit VDU MOS42 0270 E55A v06 MOS42 0364 E5A0 ; 1 return codes &87..&8B MOS42 0270 E55A v06 MOS42 0365 E5A0 ; 2 treat as softkey MOS42 0270 E55A v06 MOS42 0366 E5A0 AD 7D 02 LDA CURSED MOS42 0270 E55A v06 MOS42 0367 E5A3 D0 B3 BNE RDCHGX ;[not option 0] MOS42 0270 E55A v06 MOS42 0368 E5A5 ; option 0 MOS42 0270 E55A v06 MOS42 0369 E5A5 ; check if output to VDU MOS42 0270 E55A v06 MOS42 0370 E5A5 AD 7C 02 LDA WRCHSW MOS42 0270 E55A v06 MOS42 0371 E5A8 6A RORA MOS42 0270 E55A v06 MOS42 0372 E5A9 6A RORA MOS42 0270 E55A v06 MOS42 0373 E5AA 68 PLA ;restore converted code MOS42 0270 E55A v06 MOS42 0374 E5AB B0 CF BCS RDCHG1 ;[ignore character, output not to VDU] MOS42 0270 E55A v06 MOS42 0375 E5AD ; let VDU process code MOS42 0270 E55A v06 MOS42 0376 E5AD C9 87 CMPIM &87 MOS42 0270 E55A v06 MOS42 0377 E5AF F0 38 BEQ RDCHGY ;[COPY key] MOS42 0270 E55A v06 MOS42 0378 E5B1 ; cursor direction key MOS42 0270 E55A v06 MOS42 0379 E5B1 A8 TAY ;save X MOS42 0270 E55A v06 MOS42 0380 E5B2 8A TXA MOS42 0270 E55A v06 MOS42 0381 E5B3 48 PHA MOS42 0270 E55A v06 MOS42 0382 E5B4 98 TYA MOS42 0270 E55A v06 MOS42 0383 E5B5 20 60 D8 JSR VDUB ;N.B. cursor control entry point MOS42 0270 E55A v06 MOS42 0384 E5B8 68 PLA MOS42 0270 E55A v06 MOS42 0385 E5B9 AA TAX ;restore X MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 88 MOS42 MOS42 Buffer management MOS42 MOS42 0270 E55A v06 MOS42 0386 E5BA ; falling thru will transfer control to RDCHG1 MOS42 0270 E55A v06 MOS42 0387 E5BA RDCHG MOS42 0270 E55A v06 MOS42 0388 E5BA ; FETCH CHAR FROM RDCH BUFFER MOS42 0270 E55A v06 MOS42 0389 E5BA ; EXPAND SOFT KEYS AS NECESSARY MOS42 0270 E55A v06 MOS42 0390 E5BA ; PASS CURSOR CONTROL KEYS MOS42 0270 E55A v06 MOS42 0391 E5BA ; STRAIGHT TO VDU DRIVER MOS42 0270 E55A v06 MOS42 0392 E5BA ; RETURN CARRY SET IF CHARACTER MOS42 0270 E55A v06 MOS42 0393 E5BA ; AVAILABLE MOS42 0270 E55A v06 MOS42 0394 E5BA ; MOS42 0270 E55A v06 MOS42 0395 E5BA ; check for ECONET interception MOS42 0270 E55A v06 MOS42 0396 E5BA ; MOS42 0270 E55A v06 MOS42 0397 E5BA 2C 5F 02 BIT NETRDC MOS42 0270 E55A v06 MOS42 0398 E5BD 10 05 BPL RDCHNM ;[normal RDCH] MOS42 0270 E55A v06 MOS42 0399 E5BF ; MOS42 0270 E55A v06 MOS42 0400 E5BF ; let network supply character MOS42 0270 E55A v06 MOS42 0401 E5BF ; MOS42 0270 E55A v06 MOS42 0402 E5BF A9 06 LDAIM NTRDCH MOS42 0270 E55A v06 MOS42 0403 E5C1 6C 24 02 JMINET JMI NETVEC ;network operation call, results returned in A and C MOS42 0270 E55A v06 MOS42 0404 E5C4 MOS42 0270 E55A v06 MOS42 0405 E5C4 MOS42 0270 E55A v06 MOS42 0406 E5C4 RDCHNM ;not reading from network MOS42 0270 E55A v06 MOS42 0407 E5C4 AD 68 02 LDA SOFKL MOS42 0270 E55A v06 MOS42 0408 E5C7 F0 B3 BEQ RDCHG1 ;[no pending soft key expansion] MOS42 0270 E55A v06 MOS42 0409 E5C9 AC C9 02 LDY SOFKP MOS42 0270 E55A v06 MOS42 0410 E5CC B9 01 0B LDAAY SKBUF ;GET EXPANSION CHAR MOS42 0270 E55A v06 MOS42 0411 E5CF EE C9 02 INC SOFKP ;increment pointer into soft key buffer MOS42 0270 E55A v06 MOS42 0412 E5D2 CE 68 02 DEC SOFKL ;decrement remaining count of soft key characters MOS42 0270 E55A v06 MOS42 0413 E5D5 RDCHGCLC MOS42 0270 E55A v06 MOS42 0414 E5D5 18 CLC ;C=0 => character read successfully MOS42 0434 E5EF ^06 MOS42 0415 E5D6 RDCHG0 MOS42 0434 E5EF ^06 MOS42 0416 E5D6 60 RTS MOS42 0434 E5EF ^06 MOS42 0417 E5D7 MOS42 0434 E5EF ^06 MOS42 0418 E5D7 GKEY ;soft key detected AND soft keys enabled MOS42 0434 E5EF ^06 MOS42 0419 E5D7 68 PLA ;restore softkey code MOS42 0434 E5EF ^06 MOS42 0420 E5D8 29 0F ANDIM &0F ;convert to soft key number in range 0-15 (assumes SFTKY0=$x0)) MOS42 0434 E5EF ^06 MOS42 0421 E5DA A8 TAY ;Y := soft key number MOS42 0434 E5EF ^06 MOS42 0422 E5DB 20 EC E3 JSR SKSIZE ;A := length of soft key string given by Y MOS42 0434 E5EF ^06 MOS42 0423 E5DE 8D 68 02 STA SOFKL ;SOFKL := length of soft key string MOS42 0434 E5EF ^06 MOS42 0424 E5E1 ; N.B. X = soft key number MOS42 0434 E5EF ^06 MOS42 0425 E5E1 B9 00 0B LDAAY SKPTR MOS42 0434 E5EF ^06 MOS42 0426 E5E4 8D C9 02 STA SOFKP ;SOFKP points to key string (N.B. pointer always <> 0) MOS42 0434 E5EF ^06 MOS42 0427 E5E7 D0 D1 BNE RDCHG ;[ALWAYS JUMP] MOS42 0434 E5EF ^06 MOS42 0428 E5E9 MOS42 0434 E5EF ^06 MOS42 0429 E5E9 RDCHGY ;copy character at text cursor position MOS42 0434 E5EF ^06 MOS42 0430 E5E9 8A TXA MOS42 0434 E5EF ^06 MOS42 0431 E5EA 48 PHA ;save X MOS42 0434 E5EF ^06 MOS42 0432 E5EB 20 97 D8 JSR COPYCH ;N.B. VDU sets Z bit, but this is not used MOS42 0434 E5EF ^06 MOS42 0433 E5EE A8 TAY ;save character MOS42 0434 E5EF ^06 MOS42 0434 E5EF F0 86 BEQ RDCHGB ;[invalid character at text cursor] -- MOS42 0435 E5F1 ; valid character at cursor position -- MOS42 0436 E5F1 68 PLA -- MOS42 0437 E5F2 AA TAX ;restore X -- MOS42 0438 E5F3 98 TYA ;restore character -- MOS42 0439 E5F4 ; C=0, character in A -- MOS42 0440 E5F4 18 CLC -- MOS42 0441 E5F5 60 RTS -- MOS42 0442 E5F6 -- MOS42 0443 E5F6 -- MOS42 0444 E5F6 LNK MOS44 -- MOS44 0001 E5F6 ; > MOS44 -- MOS44 0002 E5F6 TTL MOS44 OSBYTE routines -- MOS44 0003 E5F6 OPT MOS44 MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 89 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0004 E5F6 ;(c) 1981 ACORN Computers Limited -- MOS44 0005 E5F6 ;BBC Microcomputer Machine Operating System (MOS) -- MOS44 0006 E5F6 ;Change record: -- MOS44 0007 E5F6 ;01-Mar-82 PB PEEK and POKE introduced -- MOS44 0008 E5F6 ;Author(s): -- MOS44 0009 E5F6 ;PB Paul Bond -- MOS44 0010 E5F6 -- MOS44 0011 E5F6 -- MOS44 0012 E5F6 BYTET ;table for OSBYTE. N.B. lo-byte followed by hi-byte -- MOS44 0013 E5F6 ; -- MOS44 0014 E5F6 ; 0 indicate version number -- MOS44 0015 E5F6 ; X=0 => BRK message -- MOS44 0016 E5F6 ; X<>0 => return version number in X -- MOS44 0017 E5F6 59 EA & VER -- MOS44 0018 E5F8 -- MOS44 0019 E5F8 ; -- MOS44 0020 E5F8 ; 1 set value -- MOS44 0021 E5F8 8D E9 & V2B156 -- MOS44 0022 E5FA -- MOS44 0023 E5FA ; -- MOS44 0024 E5FA ; 2 select input stream -- MOS44 0025 E5FA ; X=0 => select keyboard, disable RS423 -- MOS44 0026 E5FA ; X=1 => select RS423, enable RS423 -- MOS44 0027 E5FA ; X=2 => select keyboard, enable RS423 -- MOS44 0028 E5FA 15 E7 & SELIN -- MOS44 0029 E5FC -- MOS44 0030 E5FC ; -- MOS44 0031 E5FC ; 3 select output stream(s) -- MOS44 0032 E5FC ; X=rrrrspvl -- MOS44 0033 E5FC ; r (reserved) -- MOS44 0034 E5FC ; s=0 => spooling enabled -- MOS44 0035 E5FC ; p=0 => printing enabled -- MOS44 0036 E5FC ; v=0 => output to VDU enabled -- MOS44 0037 E5FC ; l=1 => output to RS423 enabled -- MOS44 0038 E5FC 9C E9 & V2B34 -- MOS44 0039 E5FE -- MOS44 0040 E5FE ; -- MOS44 0041 E5FE ; 4 enable/disable cursor edit -- MOS44 0042 E5FE ; X=0 => cursor editing enabled -- MOS44 0043 E5FE ; X=1 => COPY/LEFT/RIGHT/DOWN/UP return $87/$88/$89/$8A/$8B -- MOS44 0044 E5FE ; X=2 => COPY/LEFT/RIGHT/DOWN/UP at as soft keys 11 thru 15 -- MOS44 0045 E5FE 9C E9 & V2B34 -- MOS44 0046 E600 -- MOS44 0047 E600 ; -- MOS44 0048 E600 ; 5 select print destination -- MOS44 0049 E600 ; X=0 => infinite sink -- MOS44 0050 E600 ; X=1 => centronics -- MOS44 0051 E600 ; X=2 => RS423 -- MOS44 0052 E600 7B E9 & SPRINT -- MOS44 0053 E602 -- MOS44 0054 E602 ; -- MOS44 0055 E602 ; 6 set printer ignore character -- MOS44 0056 E602 ; X=0 => ignore no characters -- MOS44 0057 E602 ; X<>0 => ignore character -- MOS44 0058 E602 8D E9 & V2B156 -- MOS44 0059 E604 -- MOS44 0060 E604 ; -- MOS44 0061 E604 ; 7 set RS423 receive baud rate -- MOS44 0062 E604 ; X=0 => set default (9600) -- MOS44 0063 E604 ; X=1/2/3/4/5/6/7/8 => 75/150/300/1200/2400/4800/9600/19200 -- MOS44 0064 E604 CD E6 & RXBAUD -- MOS44 0065 E606 -- MOS44 0066 E606 ; -- MOS44 0067 E606 ; 8 set RS423 trasmit baud rate -- MOS44 0068 E606 ; [values as for OSBYTE(7)] -- MOS44 0069 E606 CB E6 & TXBAUD -- MOS44 0070 E608 -- MOS44 0071 E608 ; -- MOS44 0072 E608 ; 9 set flash mark period -- MOS44 0073 E608 ; X=0 => infinite -- MOS44 0074 E608 ; X<>0 => * 20 milliseconds -- MOS44 0075 E608 F2 E6 & FMRK -- MOS44 0076 E60A -- MOS44 0077 E60A ; -- MOS44 0078 E60A ; 10 set flash space period -- MOS44 0079 E60A ; 9 set flash mark period -- MOS44 0080 E60A ; X=0 => infinite -- MOS44 0081 E60A ; X<>0 => * 20 milliseconds -- MOS44 0082 E60A F4 E6 & FSPC -- MOS44 0083 E60C -- MOS44 0084 E60C ; -- MOS44 0085 E60C ; 11 set auto-repeat delay period -- MOS44 0086 E60C ; X=0 => suppress auto-repeat -- MOS44 0087 E60C ; X<>0 => set delay between first and second character to centiseconds -- MOS44 0088 E60C 9A E9 & ARDLY -- MOS44 0089 E60E -- MOS44 0090 E60E ; -- MOS44 0091 E60E ; 12 set auto-repeat repeat period -- MOS44 0092 E60E ; X=0 => set delay and period to values on power-up -- MOS44 0093 E60E ; X<>0 => set period between subsequent characters to centiseconds -- MOS44 0094 E60E 91 E9 & ARRPT -- MOS44 0095 E610 -- MOS44 0096 E610 ; -- MOS44 0097 E610 ; 13 disable event -- MOS44 0098 E610 ; X=event_code -- MOS44 0099 E610 ; 0: output buffer empty -- MOS44 0100 E610 ; 1: input buffer full -- MOS44 0101 E610 ; 2: character entering input buffer -- MOS44 0102 E610 ; 3: ADC conversion complete -- MOS44 0103 E610 ; 4: vertical SYNC -- MOS44 0104 E610 ; 5: interval timer crossing zero -- MOS44 0105 E610 ; 6: ESCAPE detected -- MOS44 0106 E610 ; 7: RS423 error -- MOS44 0107 E610 3B E7 & MDSABL -- MOS44 0108 E612 -- MOS44 0109 E612 ; -- MOS44 0110 E612 ; 14 enable event -- MOS44 0111 E612 ; [values as for OSBYTE(13)] -- MOS44 0112 E612 3C E7 & ENABLE -- MOS44 0113 E614 -- MOS44 0114 E614 ; -- MOS44 0115 E614 ; 15 flush buffer class -- MOS44 0116 E614 ; X=0 => flush all buffers -- MOS44 0117 E614 ; X=1 => flush currently selected input buffer -- MOS44 0118 E614 B4 F0 & FLUSHC -- MOS44 0119 E616 -- MOS44 0120 E616 ; -- MOS44 0121 E616 ; 16 select number of ADC channels -- MOS44 0122 E616 ; X=0 => stop scanning ADC channels -- MOS44 0123 E616 ; X=1/2/3/4 => only scan channels 1 thru -- MOS44 0124 E616 48 E7 & SETADC MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 90 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0125 E618 -- MOS44 0126 E618 ; -- MOS44 0127 E618 ; 17 start ADC conversion on channel X -- MOS44 0128 E618 ; X=1/2/3/4 => start conversion on channel -- MOS44 0129 E618 38 DE & ADCBEG -- MOS44 0130 E61A -- MOS44 0131 E61A ; -- MOS44 0132 E61A ; 18 reset soft keys -- MOS44 0133 E61A CD E9 & RSOFT -- MOS44 0134 E61C -- MOS44 0135 E61C ; -- MOS44 0136 E61C ; 19 wait for vertical sync -- MOS44 0137 E61C BB E9 & WFVS -- MOS44 0138 E61E -- MOS44 0139 E61E ; -- MOS44 0140 E61E ; 20 implode/explode soft font -- MOS44 0141 E61E FD CC & FONT -- MOS44 0142 E620 -- MOS44 0143 E620 ; -- MOS44 0144 E620 ; 21 flush specific buffer -- MOS44 0145 E620 C0 F0 & FLUSHS -- MOS44 0146 E622 -- MOS44 0147 E622 ; -- MOS44 0148 E622 0016 BYTEL * .-BYTET:SHR: 1 ;next entry in BYTETL table (lo component) -- MOS44 0149 E622 ; -- MOS44 0150 E622 BYTET2 -- MOS44 0151 E622 0075 BYTEM * &0075 -- MOS44 0152 E622 ; -- MOS44 0153 E622 ; -- MOS44 0154 E622 74 E8 & VDUST ;read VDU status; $75 -- MOS44 0155 E624 -- MOS44 0156 E624 ; -- MOS44 0157 E624 DE E9 & MOSTST ;reflect state of KSTAT; $76 -- MOS44 0158 E626 -- MOS44 0159 E626 ; -- MOS44 0160 E626 D1 E2 & SHUTES ;close EXEC and SPOOL files; $77 -- MOS44 0161 E628 -- MOS44 0162 E628 ; -- MOS44 0163 E628 5D F2 & OLDKEY ;set keyboard old key; $78 -- MOS44 0164 E62A -- MOS44 0165 E62A ; -- MOS44 0166 E62A DB F0 & XSCANB ;scan keyboard at specific address; $79 -- MOS44 0167 E62C -- MOS44 0168 E62C ; -- MOS44 0169 E62C D9 F0 & XSCANA ;scan keyboard from matrix entry $10; $7A -- MOS44 0170 E62E -- MOS44 0171 E62E ; -- MOS44 0172 E62E E7 E1 & PFREE ;indicate printer dormant; $7B -- MOS44 0173 E630 -- MOS44 0174 E630 ; -- MOS44 0175 E630 B6 E6 & CESCPC ;clear escape flag; $7C -- MOS44 0176 E632 -- MOS44 0177 E632 ; -- MOS44 0178 E632 B7 E6 & CESCPS ;set escape flag; $7D -- MOS44 0179 E634 -- MOS44 0180 E634 ; -- MOS44 0181 E634 9F E6 & CESCP ;clear escape flag and purge selected input buffer; $7E -- MOS44 0182 E636 -- MOS44 0183 E636 ; -- MOS44 0184 E636 8E E0 & EOF ;end of file; $7F -- MOS44 0185 E638 -- MOS44 0186 E638 ; -- MOS44 0187 E638 ; $80 -- MOS44 0188 E638 ;; read data on ADC channel -- MOS44 0189 E638 ; in: Y>=0 => X=0 => read control information -- MOS44 0190 E638 ; X<>0 => read last conversion on channel X -- MOS44 0191 E638 ; Y<0 => read info for buffer NOT(X) -- MOS44 0192 E638 ; out: Y>=0 => X=0 => X=fire-buttons, Y=last-channel-to-convert -- MOS44 0193 E638 ; X<>0 => X=lo-data, Y=hi-data -- MOS44 0194 E638 ; Y<0 => X=buffer-count (input: bytes ready, output: bytes left) -- MOS44 0195 E638 91 E7 & RADCX -- MOS44 0196 E63A -- MOS44 0197 E63A ; -- MOS44 0198 E63A ; $81 -- MOS44 0199 E63A ; read key with time limit -- MOS44 0200 E63A ; in: Y>=0 => X=lo-count, Y=hi-count (centiseconds) -- MOS44 0201 E63A ; Y<0 => X=NOT(key-matrix-address) -- MOS44 0202 E63A ; out: Y>=0 => Y=$00 => X=character -- MOS44 0203 E63A ; Y=$1B => escape condition detected -- MOS44 0204 E63A ; Y=$FF => timeout -- MOS44 0205 E63A ; Y<0 => X=0 => key not pressed -- MOS44 0206 E63A ; X<>0 => key pressed -- MOS44 0207 E63A 55 E7 & INKY -- MOS44 0208 E63C -- MOS44 0209 E63C ; -- MOS44 0210 E63C ; $82 -- MOS44 0211 E63C ; read machine high order address -- MOS44 0212 E63C ; out: X = lo-component, Y = hi-component -- MOS44 0213 E63C 6B E7 & RMHA -- MOS44 0214 E63E -- MOS44 0215 E63E ; -- MOS44 0216 E63E ; $83 -- MOS44 0217 E63E ; read operating system high water mark -- MOS44 0218 E63E ; out: X = lo-address, Y = hi-address -- MOS44 0219 E63E 94 F0 & RMLA -- MOS44 0220 E640 -- MOS44 0221 E640 ; -- MOS44 0222 E640 ; $84 -- MOS44 0223 E640 ; read address of start of current screen mode -- MOS44 0224 E640 ; out: X = lo-address, Y = hi-address -- MOS44 0225 E640 B5 D8 & TOPCMD -- MOS44 0226 E642 -- MOS44 0227 E642 ; -- MOS44 0228 E642 ; $85 -- MOS44 0229 E642 ; read address of start of screen for mode X -- MOS44 0230 E642 ; in: X = mode -- MOS44 0231 E642 ; out: X = lo-address, Y = hi-address -- MOS44 0232 E642 B8 D8 & TOPMDX -- MOS44 0233 E644 -- MOS44 0234 E644 ; -- MOS44 0235 E644 ; $86 -- MOS44 0236 E644 ;; read text cursor position -- MOS44 0237 E644 ; out: X = x-text-coord, Y = y-text-coord -- MOS44 0238 E644 E4 D5 & CSRPOS -- MOS44 0239 E646 -- MOS44 0240 E646 ; -- MOS44 0241 E646 ; $87 -- MOS44 0242 E646 ;; read character at text cursor -- MOS44 0243 E646 ; out: X=0 => no character at cursor position -- MOS44 0244 E646 ; X<>0 => X=character -- MOS44 0245 E646 ; Y = current screen mode MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 91 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0246 E646 5C D7 & READCH -- MOS44 0247 E648 -- MOS44 0248 E648 ; -- MOS44 0249 E648 ; $88 -- MOS44 0250 E648 ; *CODE X, Y -- MOS44 0251 E648 ; in: X = arg, Y = arg -- MOS44 0252 E648 ; out: C = return code -- MOS44 0253 E648 ; X = return code -- MOS44 0254 E648 ; Y = return code -- MOS44 0255 E648 9A E6 & MCODE -- MOS44 0256 E64A -- MOS44 0257 E64A ; -- MOS44 0258 E64A ; $89 -- MOS44 0259 E64A ; *MOTOR X, Y -- MOS44 0260 E64A ; in: X=0 => turn motor off -- MOS44 0261 E64A ; X=1 => turn motor on -- MOS44 0262 E64A ; Y => motor selection -- MOS44 0263 E64A C1 E6 & MOTOR ;MOTOR command; $89 -- MOS44 0264 E64C -- MOS44 0265 E64C ; -- MOS44 0266 E64C ; $8A -- MOS44 0267 E64C ; insert character into buffer -- MOS44 0268 E64C ; in: X = bufferid, Y = character -- MOS44 0269 E64C F3 E4 & INSERT -- MOS44 0270 E64E -- MOS44 0271 E64E ; -- MOS44 0272 E64E ; $8B -- MOS44 0273 E64E ; *OPT X, Y -- MOS44 0274 E64E ; in: X = arg, Y = arg (effect is filing system dependent) -- MOS44 0275 E64E 8D E0 & OPT -- MOS44 0276 E650 -- MOS44 0277 E650 ; -- MOS44 0278 E650 ; $8C -- MOS44 0279 E650 ; *TAPE X, Y -- MOS44 0280 E650 ; in: X=0 => tape filing system at default baud rate (1200 baud) -- MOS44 0281 E650 ; X=3 => tape filing system at 300 baud -- MOS44 0282 E650 ; X=12 => tape filing system at 1200 baud -- MOS44 0283 E650 ; Y=$00 => tape filing system is cassette -- MOS44 0284 E650 ; Y=$FF => tape filing system is ROMs -- MOS44 0285 E650 41 F1 & TAPE -- MOS44 0286 E652 -- MOS44 0287 E652 ; -- MOS44 0288 E652 ; $8D -- MOS44 0289 E652 ; *ROM X, Y -- MOS44 0290 E652 ; X and Y ignored -- MOS44 0291 E652 41 F1 & CROM -- MOS44 0292 E654 -- MOS44 0293 E654 ; -- MOS44 0294 E654 ; $8E -- MOS44 0295 E654 ; enter language -- MOS44 0296 E654 ; in: X = ROMid of language, Y = arg -- MOS44 0297 E654 AA DB & SELANG -- MOS44 0298 E656 -- MOS44 0299 E656 ; -- MOS44 0300 E656 ; $8F -- MOS44 0301 E656 ; call paged ROM function -- MOS44 0302 E656 ; in: X = reason code, Y = arg -- MOS44 0303 E656 ; out: C = return code -- MOS44 0304 E656 ; Y = return code -- MOS44 0305 E656 74 F1 & SVOP -- MOS44 0306 E658 -- MOS44 0307 E658 ; -- MOS44 0308 E658 ; $90 -- MOS44 0309 E658 ; alter TV characteristics -- MOS44 0310 E658 ; in: X = vertical sync adjust, Y = interlace adjust -- MOS44 0311 E658 2F EB & TV -- MOS44 0312 E65A -- MOS44 0313 E65A ; -- MOS44 0314 E65A ; $91 -- MOS44 0315 E65A ; remove character from buffer -- MOS44 0316 E65A ; in: X = bufferid -- MOS44 0317 E65A ; out: C=0 => Y=character -- MOS44 0318 E65A ; C=1 => buffer empty -- MOS44 0319 E65A A4 E4 & REMOV -- MOS44 0320 E65C -- MOS44 0321 E65C [ MOS125 = &FF -- MOS44 0360 E65C | -- MOS44 0361 E65C ; -- MOS44 0362 E65C ; $92 -- MOS44 0363 E65C ; read from FRED -- MOS44 0364 E65C ; in: X = offset -- MOS44 0365 E65C ; out: Y = value -- MOS44 0366 E65C 22 EA & CHEQUE -- MOS44 0367 E65E -- MOS44 0368 E65E ; -- MOS44 0369 E65E ; $93 -- MOS44 0370 E65E ; write to FRED -- MOS44 0371 E65E ; in: X = offset, Y = value -- MOS44 0372 E65E 22 EA & CHEQUE -- MOS44 0373 E660 -- MOS44 0374 E660 ; -- MOS44 0375 E660 ; $94 -- MOS44 0376 E660 ; read from JIM -- MOS44 0377 E660 ; in: X = offset -- MOS44 0378 E660 ; out: Y = value -- MOS44 0379 E660 22 EA & CHEQUE -- MOS44 0380 E662 -- MOS44 0381 E662 ; -- MOS44 0382 E662 ; $95 -- MOS44 0383 E662 ; write to JIM -- MOS44 0384 E662 ; in: X = offset, Y = value -- MOS44 0385 E662 22 EA & CHEQUE -- MOS44 0386 E664 -- MOS44 0387 E664 ; -- MOS44 0388 E664 ; $96 -- MOS44 0389 E664 ; read from SHEILA -- MOS44 0390 E664 ; in: X = offset -- MOS44 0391 E664 ; out: Y = value -- MOS44 0392 E664 22 EA & CHEQUE -- MOS44 0393 E666 -- MOS44 0394 E666 ; -- MOS44 0395 E666 ; $97 -- MOS44 0396 E666 ; write to SHEILA -- MOS44 0397 E666 ; in: X = offset, Y = value -- MOS44 0398 E666 22 EA & CHEQUE -- MOS44 0399 E668 ] -- MOS44 0400 E668 -- MOS44 0401 E668 ; -- MOS44 0402 E668 ; $98 -- MOS44 0403 E668 ; examine character in buffer -- MOS44 0404 E668 ; in: X = bufferid MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 92 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0405 E668 ; out: C=0 => Y=character -- MOS44 0406 E668 ; C=1 => buffer empty -- MOS44 0407 E668 9F E4 & EXAM -- MOS44 0408 E66A -- MOS44 0409 E66A ; -- MOS44 0410 E66A ; $99 -- MOS44 0411 E66A ; insert character into buffer dealing with ESC code -- MOS44 0412 E66A ; in: X = bufferid, Y = character -- MOS44 0413 E66A 36 E5 & RNSRT -- MOS44 0414 E66C -- MOS44 0415 E66C ; -- MOS44 0416 E66C ;; $9A -- MOS44 0417 E66C ; update vidproc control register -- MOS44 0418 E66C ; in: X = value -- MOS44 0419 E66C 04 EA & VP0 -- MOS44 0420 E66E -- MOS44 0421 E66E ; -- MOS44 0422 E66E ; $9B -- MOS44 0423 E66E ; update vidproc palette register -- MOS44 0424 E66E ; in: X = value EOR $07 -- MOS44 0425 E66E 15 EA & VP1 -- MOS44 0426 E670 -- MOS44 0427 E670 ; -- MOS44 0428 E670 ; $9C -- MOS44 0429 E670 ; update 6850 ACIA -- MOS44 0430 E670 ; in: X = value, Y = mask -- MOS44 0431 E670 CC E1 & RS423 -- MOS44 0432 E672 -- MOS44 0433 E672 ; -- MOS44 0434 E672 ; $9D -- MOS44 0435 E672 ; fast tube BPUT -- MOS44 0436 E672 ; in: X = byte, Y = handle -- MOS44 0437 E672 66 FF & FXBPUT -- MOS44 0438 E674 -- MOS44 0439 E674 ; -- MOS44 0440 E674 ; $9E -- MOS44 0441 E674 ; read from speech chip -- MOS44 0442 E674 ; in: Y = command -- MOS44 0443 E674 ; out: Y = result -- MOS44 0444 E674 89 EE & RSPECH -- MOS44 0445 E676 -- MOS44 0446 E676 ; -- MOS44 0447 E676 ; $9F -- MOS44 0448 E676 ; write to speech chip -- MOS44 0449 E676 ; in: Y = command -- MOS44 0450 E676 9B EE & WSPECH -- MOS44 0451 E678 -- MOS44 0452 E678 ; -- MOS44 0453 E678 ; $A0 -- MOS44 0454 E678 ; read VDU variables -- MOS44 0455 E678 ; in: X = index -- MOS44 0456 E678 ; out: X = variable0, Y = variable1 -- MOS44 0457 E678 C5 E9 & VDUVAR -- MOS44 0458 E67A -- MOS44 0459 E67A ; -- MOS44 0460 E67A 00A1 BYTEH * .-BYTET2:SHR: 1+BYTEM ;next entry in BYTET table (hi component) -- MOS44 0461 E67A ; -- MOS44 0462 E67A A1 E9 & SETV ;set variable -- MOS44 0463 E67C -- MOS44 0464 E67C ; -- MOS44 0465 E67C 9C E6 & JMIUSR ;OSWORD calls >=$E0 -- MOS44 0466 E67E -- MOS44 0467 E67E -- MOS44 0468 E67E -- MOS44 0469 E67E WORDT ;table for OSWORD. N.B. lo-byte followed by hi-byte -- MOS44 0470 E67E ; -- MOS44 0471 E67E 03 E9 & RDLN ;read line; $00 -- MOS44 0472 E680 -- MOS44 0473 E680 ; -- MOS44 0474 E680 D9 E8 & RATM ;read absolute time; $01 -- MOS44 0475 E682 -- MOS44 0476 E682 ; -- MOS44 0477 E682 E8 E8 & WATM ;write absolute time; $02 -- MOS44 0478 E684 -- MOS44 0479 E684 ; -- MOS44 0480 E684 D5 E8 & RITM ;read interval time; $03 -- MOS44 0481 E686 -- MOS44 0482 E686 ; -- MOS44 0483 E686 EC E8 & WITM ;write interval time; $04 -- MOS44 0484 E688 -- MOS44 0485 E688 ; -- MOS44 0486 E688 46 EA & PEEK ;PEEK; $05 -- MOS44 0487 E68A -- MOS44 0488 E68A ; -- MOS44 0489 E68A 47 EA & POKE ;POKE; $06 -- MOS44 0490 E68C -- MOS44 0491 E68C ; -- MOS44 0492 E68C 0007 OSWSND * .-WORDT:SHR: 1 -- MOS44 0493 E68C ; -- MOS44 0494 E68C 35 E8 & NOTE ;sound; $07 -- MOS44 0495 E68E -- MOS44 0496 E68E ; -- MOS44 0497 E68E B6 E8 & NVLP ;define envelope; $08 -- MOS44 0498 E690 -- MOS44 0499 E690 ; -- MOS44 0500 E690 34 C7 & RPXLXY ;read pixel at given coordinate to X; $09 -- MOS44 0501 E692 -- MOS44 0502 E692 ; -- MOS44 0503 E692 CF CB & RCHDEF ;read character definition of XY to XY+1..8; $0A -- MOS44 0504 E694 -- MOS44 0505 E694 ; -- MOS44 0506 E694 7A C7 & RPALET ;read palette for XY to XY+1..4; $0B -- MOS44 0507 E696 -- MOS44 0508 E696 ; -- MOS44 0509 E696 C6 C8 & PRPAL ;programme palette; $0C -- MOS44 0510 E698 -- MOS44 0511 E698 ; -- MOS44 0512 E698 80 D5 & CSREAD ;cursor read; $0D -- MOS44 0513 E69A -- MOS44 0514 E69A ; -- MOS44 0515 E69A 000E WORDN * .-WORDT:SHR: 1 ;number of entries in WORDT table -- MOS44 0516 E69A -- MOS44 0517 E69A -- MOS44 0518 E69A [ NOSP = &00 -- MOS44 0520 E69A | -- MOS44 0521 E69A MCODE ;call user code -- MOS44 0522 E69A A9 00 LDAIM ZERO -- MOS44 0523 E69C 6C 00 02 JMIUSR JMI USRVEC ;user OSBYTE call/OSWORD calls -- MOS44 0524 E69F ] -- MOS44 0525 E69F -- MOS44 0526 E69F MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 93 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0527 E69F ; OSBYTE specific routines -- MOS44 0528 E69F ; N.B. routines must exit with PLP to restore -- MOS44 0529 E69F ; caller's interrupt state -- MOS44 0530 E69F CESCP ;clear escape flag ad purge selected input buffer -- MOS44 0531 E69F A2 00 LDXIM ZERO ;indicate escape not cleared -- MOS44 0532 E6A1 24 FF BIT ESCFLG -- MOS44 0533 E6A3 10 11 BPL CESCPC ;[no escape to clear] MOS44 0533 E6A3 v6E MOS44 0534 E6A5 ; bypass procedure ? MOS44 0533 E6A3 v6E MOS44 0535 E6A5 AD 76 02 LDA EAOPT MOS44 0533 E6A3 v6E MOS44 0536 E6A8 D0 0A BNE CESCX ;[bypass normal acknowledge procedure] MOS44 0533 E6A3 v6E MOS44 0537 E6AA ; Z=1, A=$00 MOS44 0533 E6A3 v6E MOS44 0538 E6AA ; close exec file MOS44 0533 E6A3 v6E MOS44 0539 E6AA 58 CLI ;********** (close may be a long operation) MOS44 0533 E6A3 v6E MOS44 0540 E6AB 8D 69 02 STA LINES ;reset page mode page origin MOS44 0533 E6A3 v6E MOS44 0541 E6AE 20 BD F6 JSR EXEC ;just close exec file, N.B. needs Z=1, A=$00 MOS44 0533 E6A3 v6E MOS44 0542 E6B1 ; flush all buffers and clear soft key expansion MOS44 0533 E6A3 v6E MOS44 0543 E6B1 20 B6 F0 JSR FLSHAL ;N.B. also kills sound AND cancels VDU queueing MOS44 0533 E6A3 v6E MOS44 0544 E6B4 CESCX MOS44 0533 E6A3 v6E MOS44 0545 E6B4 A2 FF LDXIM &FF ;indicate escape cleared MOS44 0533 E6A3 v6E MOS44 0546 E6B6 CESCPC ;clear system escape flag MOS44 0533 E6A3 v6E MOS44 0547 E6B6 18 CLC -- MOS44 0548 E6B7 CESCPS ;set system escape flag (N.B. C=1) -- MOS44 0549 E6B7 66 FF ROR ESCFLG -- MOS44 0550 E6B9 2C 7A 02 BIT TUBEM -- MOS44 0551 E6BC [ MOS125 = &FF -- MOS44 0554 E6BC | -- MOS44 0555 E6BC 10 33 BPL TESCO ;[tube inactive] MOS44 0555 E6BC v4C MOS44 0556 E6BE ] MOS44 0555 E6BC v4C MOS44 0557 E6BE ; MOS44 0555 E6BC v4C MOS44 0558 E6BE TESC MOS44 0555 E6BC v4C MOS44 0559 E6BE 4C 03 04 JMP TBESC ;tube escape MOS44 0555 E6BC v4C MOS44 0560 E6C1 MOS44 0555 E6BC v4C MOS44 0561 E6C1 MOS44 0555 E6BC v4C MOS44 0562 E6C1 MOTOR ;control cassette motor MOS44 0555 E6BC v4C MOS44 0563 E6C1 ; on entry: X=0 => motor off MOS44 0555 E6BC v4C MOS44 0564 E6C1 ; X<>0 => motor on MOS44 0555 E6BC v4C MOS44 0565 E6C1 ; N.B. previous instruction was LDX MOS44 0555 E6BC v4C MOS44 0566 E6C1 AD 82 02 LDA SPREGA MOS44 0555 E6BC v4C MOS44 0567 E6C4 A8 TAY ;Y := old value MOS44 0555 E6BC v4C MOS44 0568 E6C5 ; MOS44 0555 E6BC v4C MOS44 0569 E6C5 2A ROLA MOS44 0555 E6BC v4C MOS44 0570 E6C6 E0 01 CPXIM &01 ;C=0 => X=0, C=1 => X<>0 MOS44 0555 E6BC v4C MOS44 0571 E6C8 6A RORA MOS44 0555 E6BC v4C MOS44 0572 E6C9 50 1E BVC STASP ;[ALWAYS jump] MOS44 0555 E6BC v4C MOS44 0573 E6CB MOS44 0555 E6BC v4C MOS44 0574 E6CB MOS44 0555 E6BC v4C MOS44 0575 E6CB TXBAUD ;set RS423 transmit baudrate (N.B. A=$08) MOS44 0555 E6BC v4C MOS44 0576 E6CB A9 38 LDAIM &38 MOS44 0555 E6BC v4C MOS44 0577 E6CD RXBAUD ;set RS423 receive baudrate (N.B. A=$07) MOS44 0555 E6BC v4C MOS44 0578 E6CD 49 3F EORIM &3F ;Rx: A=$38, Tx: A=$07 MOS44 0555 E6BC v4C MOS44 0579 E6CF 85 FA STA MASK MOS44 0555 E6BC v4C MOS44 0580 E6D1 AC 82 02 LDY SPREGA MOS44 0555 E6BC v4C MOS44 0581 E6D4 E0 09 CPXIM &09 MOS44 0555 E6BC v4C MOS44 0582 E6D6 B0 17 BCS BAUD1 ;[bad baud selection] MOS44 0555 E6BC v4C MOS44 0583 E6D8 3D B2 E9 ANDAX BAUDS ;extract serproc baud bits MOS44 0555 E6BC v4C MOS44 0584 E6DB 85 FB STA BAUD MOS44 0555 E6BC v4C MOS44 0585 E6DD 98 TYA MOS44 0555 E6BC v4C MOS44 0586 E6DE 05 FA ORA MASK MOS44 0555 E6BC v4C MOS44 0587 E6E0 45 FA EOR MASK ;clear slot for baudrate MOS44 0555 E6BC v4C MOS44 0588 E6E2 05 FB ORA BAUD MOS44 0555 E6BC v4C MOS44 0589 E6E4 09 40 ORAIM &40 ;set cassette/RS423 bit MOS44 0555 E6BC v4C MOS44 0590 E6E6 4D 5D 02 EOR RSCASS ;select cassette/RS423 MOS44 0555 E6BC v4C MOS44 0591 E6E9 ; MOS44 0555 E6BC v4C MOS44 0592 E6E9 STASP ;used by MOTOR and RESET MOS44 0555 E6BC v4C MOS44 0593 E6E9 8D 82 02 STA SPREGA MOS44 0555 E6BC v4C MOS44 0594 E6EC 8D 10 FE STA SERPRC MOS44 0555 E6BC v4C MOS44 0595 E6EF ; MOS44 0555 E6BC v4C MOS44 0596 E6EF BAUD1 MOS44 0555 E6BC v4C MOS44 0597 E6EF TYATAX ;used by TXBAUD, RXBAUD, FSPC, FMRK MOS44 0555 E6BC v4C MOS44 0598 E6EF 98 TYA MOS44 0686 E746 ^27 MOS44 0599 E6F0 BADEVT MOS44 0686 E746 ^27 MOS44 0600 E6F0 AA TAX ;X := old value (bad events appear disabled) MOS44 0686 E746 ^27 MOS44 0601 E6F1 [ MOS125 = &FF MOS44 0686 E746 ^27 MOS44 0602 E6F1 | MOS44 0686 E746 ^27 MOS44 0603 E6F1 TESCO MOS44 0686 E746 ^27 MOS44 0604 E6F1 ] MOS44 0686 E746 ^27 MOS44 0605 E6F1 60 RTS MOS44 0686 E746 ^27 MOS44 0606 E6F2 MOS44 0686 E746 ^27 MOS44 0607 E6F2 MOS44 0686 E746 ^27 MOS44 0608 E6F2 FMRK ;set flash mark, Y=0, C=1 MOS44 0686 E746 ^27 MOS44 0609 E6F2 C8 INY MOS44 0686 E746 ^27 MOS44 0610 E6F3 18 CLC MOS44 0686 E746 ^27 MOS44 0611 E6F4 ; MOS44 0686 E746 ^27 MOS44 0612 E6F4 ; Y=1, C=0 MOS44 0686 E746 ^27 MOS44 0613 E6F4 ; MOS44 0686 E746 ^27 MOS44 0614 E6F4 FSPC ;set flash space, Y=0, C=1 MOS44 0686 E746 ^27 MOS44 0615 E6F4 B9 52 02 LDAAY FLASHB MOS44 0686 E746 ^27 MOS44 0616 E6F7 ; MOS44 0686 E746 ^27 MOS44 0617 E6F7 48 PHA MOS44 0686 E746 ^27 MOS44 0618 E6F8 8A TXA MOS44 0686 E746 ^27 MOS44 0619 E6F9 99 52 02 STAAY FLASHB MOS44 0686 E746 ^27 MOS44 0620 E6FC 68 PLA MOS44 0686 E746 ^27 MOS44 0621 E6FD ; MOS44 0686 E746 ^27 MOS44 0622 E6FD A8 TAY MOS44 0686 E746 ^27 MOS44 0623 E6FE ; MOS44 0686 E746 ^27 MOS44 0624 E6FE ; C=0 => mark, C=1 => space MOS44 0686 E746 ^27 MOS44 0625 E6FE ; FMS0 exit used, despite X not being corrupted MOS44 0686 E746 ^27 MOS44 0626 E6FE ; (makes code clearer) MOS44 0686 E746 ^27 MOS44 0627 E6FE AD 51 02 LDA FLCNT MOS44 0686 E746 ^27 MOS44 0628 E701 D0 10 BNE FMS1 ;[flash enabled] MOS44 0686 E746 ^27 MOS44 0629 E703 ; 'kick' flash count MOS44 0686 E746 ^27 MOS44 0630 E703 8E 51 02 STX FLCNT MOS44 0686 E746 ^27 MOS44 0631 E706 ; force mark/space (lsb VPREGA := C) MOS44 0686 E746 ^27 MOS44 0632 E706 AD 48 02 LDA VPREGA MOS44 0686 E746 ^27 MOS44 0633 E709 [ MOS125 = &FF MOS44 0686 E746 ^27 MOS44 0638 E709 | MOS44 0686 E746 ^27 MOS44 0639 E709 ;same size, faster, reduce stack load MOS44 0686 E746 ^27 MOS44 0640 E709 29 FE ANDIM &FE MOS44 0686 E746 ^27 MOS44 0641 E70B 69 00 ADCIM &00 ;V=0 MOS44 0686 E746 ^27 MOS44 0642 E70D ] MOS44 0686 E746 ^27 MOS44 0643 E70D 8D 48 02 STA VPREGA MOS44 0686 E746 ^27 MOS44 0644 E710 8D 20 FE STA VPROC0 MOS44 0686 E746 ^27 MOS44 0645 E713 FMS1 ; chain from clear escape condition routine MOS44 0686 E746 ^27 MOS44 0646 E713 50 DA BVC TYATAX ;[ALWAYS jump] MOS44 0686 E746 ^27 MOS44 0647 E715 MOS44 0686 E746 ^27 MOS44 0648 E715 MOS44 0686 E746 ^27 MOS44 0649 E715 SELIN ;select input MOS44 0686 E746 ^27 MOS44 0650 E715 8A TXA MOS44 0686 E746 ^27 MOS44 0651 E716 29 01 ANDIM &01 ;force legal bufferid MOS44 0686 E746 ^27 MOS44 0652 E718 48 PHA ;save change MOS44 0686 E746 ^27 MOS44 0653 E719 AD 50 02 LDA RSCTFL ;A := old state of controller status MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 94 MOS44 MOS44 OSBYTE routines MOS44 MOS44 0686 E746 ^27 MOS44 0654 E71C 2A ROLA MOS44 0686 E746 ^27 MOS44 0655 E71D E0 01 CPXIM &01 ;C=0 => disable RS423, C=1 => enable RS423 MOS44 0686 E746 ^27 MOS44 0656 E71F 6A RORA ;A := new state of controller status MOS44 0686 E746 ^27 MOS44 0657 E720 ; *FX 2,0 disables RS423, *FX 2,(1,2) enables RS423 MOS44 0686 E746 ^27 MOS44 0658 E720 ; if RS423 then enable RS423 Rx interrupt MOS44 0686 E746 ^27 MOS44 0659 E720 CD 50 02 CMP RSCTFL MOS44 0686 E746 ^27 MOS44 0660 E723 08 PHP MOS44 0686 E746 ^27 MOS44 0661 E724 8D 50 02 STA RSCTFL MOS44 0686 E746 ^27 MOS44 0662 E727 8D 08 FE STA RSCTL ;update RS423 control register MOS44 0686 E746 ^27 MOS44 0663 E72A 20 C3 E1 JSR RSETX ;set RHITXE if possible MOS44 0686 E746 ^27 MOS44 0664 E72D 28 PLP MOS44 0686 E746 ^27 MOS44 0665 E72E F0 03 BEQ SELIN1 ;branch if no change MOS44 0686 E746 ^27 MOS44 0666 E730 2C 09 FE BIT RSDATA ;purge character in controller MOS44 0686 E746 ^27 MOS44 0667 E733 ; this purges data register if: disabled state -> enabled state MOS44 0686 E746 ^27 MOS44 0668 E733 ; this does not matter if: enabled state -> disabled state MOS44 0686 E746 ^27 MOS44 0669 E733 SELIN1 MOS44 0686 E746 ^27 MOS44 0670 E733 AE 41 02 LDX RDCHSW ;X := old value MOS44 0686 E746 ^27 MOS44 0671 E736 68 PLA MOS44 0686 E746 ^27 MOS44 0672 E737 8D 41 02 STA RDCHSW ;update value MOS44 0686 E746 ^27 MOS44 0673 E73A 60 RTS MOS44 0686 E746 ^27 MOS44 0674 E73B MOS44 0686 E746 ^27 MOS44 0675 E73B MOS44 0686 E746 ^27 MOS44 0676 E73B MDSABL ;disable event X MOS44 0686 E746 ^27 MOS44 0677 E73B ; N.B. Y=0 MOS44 0686 E746 ^27 MOS44 0678 E73B 98 TYA ;A := 0 MOS44 0686 E746 ^27 MOS44 0679 E73C ;* LDAIM ZERO MOS44 0686 E746 ^27 MOS44 0680 E73C ENABLE ;enable event X (N.B. A<>$00) MOS44 0686 E746 ^27 MOS44 0681 E73C E0 0A CPXIM NEVENT MOS44 0686 E746 ^27 MOS44 0682 E73E B0 B0 BCS BADEVT MOS44 0686 E746 ^27 MOS44 0683 E740 BC BF 02 LDYAX EVENTS MOS44 0686 E746 ^27 MOS44 0684 E743 9D BF 02 STAAX EVENTS MOS44 0686 E746 ^27 MOS44 0685 E746 ; MOS44 0686 E746 ^27 MOS44 0686 E746 50 A7 BVC TYATAX ;[ALWAYS jump] -- MOS44 0687 E748 -- MOS44 0688 E748 -- MOS44 0689 E748 SETADC ;set number of ADC channels to scan -- MOS44 0690 E748 ; N.B. preceeding instruction was LDX -- MOS44 0691 E748 ; Y=0 -- MOS44 0692 E748 F0 03 BEQ SETAD1 ;[kill ADC (eventually)] MOS44 0692 E748 v7C MOS44 0693 E74A 20 38 DE JSR ADCBEG ;initiate conversion on channel X, uses Y=0 MOS44 0692 E748 v7C MOS44 0694 E74D ; N.B. X not corrupted MOS44 0692 E748 v7C MOS44 0695 E74D SETAD1 MOS44 0692 E748 v7C MOS44 0696 E74D ; a value of X=0 stops the ADC after the next (external) channel 1 MOS44 0692 E748 v7C MOS44 0697 E74D ; conversion MOS44 0692 E748 v7C MOS44 0698 E74D AD 4D 02 LDA MAXADC -- MOS44 0699 E750 8E 4D 02 STX MAXADC -- MOS44 0700 E753 AA TAX ;X := old value -- MOS44 0701 E754 60 RTS -- MOS44 0702 E755 -- MOS44 0703 E755 -- MOS44 0704 E755 INKY ;read key with time limit -- MOS44 0705 E755 98 TYA -- MOS44 0706 E756 30 0B BMI RDKY MOS44 0706 E756 v74 MOS44 0707 E758 58 CLI ;**** ENABLE INTERRUPTS MOS44 0706 E756 v74 MOS44 0708 E759 20 67 DE JSR INKEY MOS44 0706 E756 v74 MOS44 0709 E75C B0 03 BCS INKY1 ;[escape detected or count exhausted] MOS44 0706 E756 v74 MOS44 0710 E75E ; MOS44 0706 E756 v74 MOS44 0711 E75E ; character read MOS44 0706 E756 v74 MOS44 0712 E75E ; MOS44 0706 E756 v74 MOS44 0713 E75E AA TAX ;X := character (INKEY) or lo-count (BUFN) MOS44 0706 E756 v74 MOS44 0714 E75F A9 00 LDAIM ZERO ;Y = 0 => success MOS44 0706 E756 v74 MOS44 0715 E761 ; MOS44 0706 E756 v74 MOS44 0716 E761 INKY1 ;escape detected or count exhausted, C=1 MOS44 0706 E756 v74 MOS44 0717 E761 A8 TAY ;Y < $80 => escape, Y >= $80 => count exhausted MOS44 0706 E756 v74 MOS44 0718 E762 60 RTS MOS44 0706 E756 v74 MOS44 0719 E763 MOS44 0706 E756 v74 MOS44 0720 E763 MOS44 0706 E756 v74 MOS44 0721 E763 RDKY ;C=1, V=0, read key addressed by X MOS44 0706 E756 v74 MOS44 0722 E763 ; N.B. interrupts disabled MOS44 0706 E756 v74 MOS44 0723 E763 ; MOS44 0706 E756 v74 MOS44 0724 E763 ; test key at matrix address MOS44 0706 E756 v74 MOS44 0725 E763 ; MOS44 0706 E756 v74 MOS44 0726 E763 [ $Tutu MOS44 0706 E756 v74 MOS44 0734 E763 | MOS44 0706 E756 v74 MOS44 0735 E763 8A TXA -- MOS44 0736 E764 49 7F EORIM &7F -- MOS44 0737 E766 AA TAX -- MOS44 0738 E767 20 77 F0 JSR JMIKEY -- MOS44 0739 E76A 2A ROLA ;result into C -- MOS44 0740 E76B ] -- MOS44 0741 E76B ; -- MOS44 0742 E76B BADADC ;entered with C=1 -- MOS44 0743 E76B RMHA ;entered with C=1 -- MOS44 0744 E76B ; C=0 => return 0, C=1 => return -1 -- MOS44 0745 E76B A2 FF LDXIM &FF ;N.B. I/O processor is notionally located at address $FFFFxxxx MOS44 0806 E795 ^54 MOS44 0746 E76D A0 FF LDYIM &FF MOS44 0806 E795 ^54 MOS44 0747 E76F B0 02 BCS RDKY0 MOS44 0806 E795 ^54 MOS44 0748 E771 ; INKEY entry (key open) MOS44 0806 E795 ^54 MOS44 0749 E771 E8 INX ;X=0 MOS44 0806 E795 ^54 MOS44 0750 E772 ; invalid soft key read, return Y<>0 MOS44 0806 E795 ^54 MOS44 0751 E772 C8 INY ;Y=0 (except for soft key read entry) MOS44 0806 E795 ^54 MOS44 0752 E773 RDKY0 MOS44 0806 E795 ^54 MOS44 0753 E773 60 RTS MOS44 0806 E795 ^54 MOS44 0754 E774 MOS44 0806 E795 ^54 MOS44 0755 E774 MOS44 0806 E795 ^54 MOS44 0756 E774 BUFN ;count entries in buffer, called by FX ADVAL with negative argument MOS44 0806 E795 ^54 MOS44 0757 E774 ; -N gives count for buffer with external id N MOS44 0806 E795 ^54 MOS44 0758 E774 ; C=1 (by FX conventions) MOS44 0806 E795 ^54 MOS44 0759 E774 8A TXA MOS44 0806 E795 ^54 MOS44 0760 E775 49 FF EORIM &FF MOS44 0806 E795 ^54 MOS44 0761 E777 AA TAX ;X := bufferid MOS44 0806 E795 ^54 MOS44 0762 E778 ; MOS44 0806 E795 ^54 MOS44 0763 E778 ; count entries (in)/(remaining in) buffer given by X MOS44 0806 E795 ^54 MOS44 0764 E778 ; returns: MOS44 0806 E795 ^54 MOS44 0765 E778 ; number of entries present for input buffers MOS44 0806 E795 ^54 MOS44 0766 E778 ; number of entries remaining for output buffers MOS44 0806 E795 ^54 MOS44 0767 E778 ; MOS44 0806 E795 ^54 MOS44 0768 E778 E0 02 CPXIM OUTPUT MOS44 0806 E795 ^54 MOS44 0769 E77A ; C=0 => count used entries MOS44 0806 E795 ^54 MOS44 0770 E77A ; C=1 => count free slots MOS44 0806 E795 ^54 MOS44 0771 E77A ; MOS44 0806 E795 ^54 MOS44 0772 E77A JMICNT MOS44 0806 E795 ^54 MOS44 0773 E77A B8 CLV ;V=0 => count buffer entry MOS44 0806 E795 ^54 MOS44 0774 E77B 50 03 BVC JMICNP ;[ALWAYS jump] MOS44 0806 E795 ^54 MOS44 0775 E77D ; MOS44 0806 E795 ^54 MOS44 0776 E77D 2C 49 D9 JMIPUR BIT FFBYT ;V=1 MOS44 0806 E795 ^54 MOS44 0777 E780 6C 2E 02 JMICNP JMI CNPVEC ;use indirection (defaults to CNP) MOS44 0806 E795 ^54 MOS44 0778 E783 ; return count in X (lo) and Y (hi) MOS44 0806 E795 ^54 MOS44 0779 E783 MOS44 0806 E795 ^54 MOS44 0780 E783 MOS44 0806 E795 ^54 MOS44 0781 E783 CNTRS ;count bytes left in RS423 input buffer MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 95 MOS44 MOS44 OSBYTE routines MOS44 MOS44 0806 E795 ^54 MOS44 0782 E783 38 SEC ;count empty slots left ... MOS44 0806 E795 ^54 MOS44 0783 E784 A2 01 LDXIM BRSI ;... in RS423 input buffer MOS44 0806 E795 ^54 MOS44 0784 E786 20 7A E7 JSR JMICNT MOS44 0806 E795 ^54 MOS44 0785 E789 ; count in Y (hi) and X (lo) MOS44 0806 E795 ^54 MOS44 0786 E789 C0 01 CPYIM &01 MOS44 0806 E795 ^54 MOS44 0787 E78B B0 03 BCS CNTRS0 ;[more than RSOVER bytes left] MOS44 0806 E795 ^54 MOS44 0788 E78D ; MOS44 0806 E795 ^54 MOS44 0789 E78D EC 5B 02 CPX RSHLVL MOS44 0806 E795 ^54 MOS44 0790 E790 ; MOS44 0806 E795 ^54 MOS44 0791 E790 CNTRS0 MOS44 0806 E795 ^54 MOS44 0792 E790 ; C=0 => overflow MOS44 0806 E795 ^54 MOS44 0793 E790 ; C=1 => no overflow MOS44 0806 E795 ^54 MOS44 0794 E790 60 RTS MOS44 0806 E795 ^54 MOS44 0795 E791 MOS44 0806 E795 ^54 MOS44 0796 E791 MOS44 0806 E795 ^54 MOS44 0797 E791 RADCX ;read ADC channel X MOS44 0806 E795 ^54 MOS44 0798 E791 [ MOS125 = &FF MOS44 0806 E795 ^54 MOS44 0803 E791 | MOS44 0806 E795 ^54 MOS44 0804 E791 30 E1 BMI BUFN ;[count entries in buffer] MOS44 0806 E795 ^54 MOS44 0805 E793 E0 05 CPXIM &05 MOS44 0806 E795 ^54 MOS44 0806 E795 B0 D4 BCS BADADC -- MOS44 0807 E797 8A TXA -- MOS44 0808 E798 F0 08 BEQ FIRE ;[get status of fire buttons] MOS44 0808 E798 v77 MOS44 0809 E79A ] MOS44 0808 E798 v77 MOS44 0810 E79A ; return latest conversion MOS44 0808 E798 v77 MOS44 0811 E79A BC B9 02 LDYAX ADCHIV -&01 MOS44 0808 E798 v77 MOS44 0812 E79D BD B5 02 LDAAX ADCLOV -&01 MOS44 0808 E798 v77 MOS44 0813 E7A0 AA TAX ;X := lo-byte MOS44 0808 E798 v77 MOS44 0814 E7A1 60 RTS MOS44 0808 E798 v77 MOS44 0815 E7A2 MOS44 0808 E798 v77 MOS44 0816 E7A2 MOS44 0808 E798 v77 MOS44 0817 E7A2 FIRE ;get status of fire buttons MOS44 0808 E798 v77 MOS44 0818 E7A2 [ MOS125 = &FF MOS44 0808 E798 v77 MOS44 0826 E7A2 | MOS44 0808 E798 v77 MOS44 0827 E7A2 ; X=0, A=0, C=0 MOS44 0808 E798 v77 MOS44 0828 E7A2 ED 40 FE SBC PBQ ;take one's complement of system VIA port B -- MOS44 0829 E7A5 6A RORA -- MOS44 0830 E7A6 6A RORA -- MOS44 0831 E7A7 6A RORA -- MOS44 0832 E7A8 6A RORA -- MOS44 0833 E7A9 ] -- MOS44 0834 E7A9 29 03 ANDIM &03 ;A := fire buttons -- MOS44 0835 E7AB AC BE 02 LDY ADCFLG ;return latest conversion number -- MOS44 0836 E7AE ; clear latest conversion number -- MOS44 0837 E7AE 8E BE 02 STX ADCFLG -- MOS44 0838 E7B1 AA TAX ;return status of fire buttons in b0 and b1 -- MOS44 0839 E7B2 60 RTS -- MOS44 0840 E7B3 -- MOS44 0841 E7B3 -- MOS44 0842 E7B3 LNK MOS46 -- MOS46 0001 E7B3 ; > MOS46 -- MOS46 0002 E7B3 TTL MOS46 OSWORD routines -- MOS46 0003 E7B3 OPT MOS46 MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 96 MOS46 MOS46 OSWORD routines MOS46 -- MOS46 0004 E7B3 ;(c) 1981 ACORN Computers Limited -- MOS46 0005 E7B3 ;BBC MOS -- MOS46 0006 E7B3 ;Change record: -- MOS46 0007 E7B3 ;203 01-May-82 PB Fix EXTSND bug -- MOS46 0008 E7B3 ;041 15-Aug-81 PB First edition -- MOS46 0009 E7B3 ;Author(s): -- MOS46 0010 E7B3 ;PB Paul Bond -- MOS46 0011 E7B3 -- MOS46 0012 E7B3 -- MOS46 0013 E7B3 BYTE ;OSBYTE call -- MOS46 0014 E7B3 ; -- MOS46 0015 E7B3 ; uses: -- MOS46 0016 E7B3 ; BYTEX, BYTEY (may be shared by sei-routines) -- MOS46 0017 E7B3 ; JMILO, JMIHI -- MOS46 0018 E7B3 ; -- MOS46 0019 E7B3 48 PHA -- MOS46 0020 E7B4 08 PHP -- MOS46 0021 E7B5 78 SEI ;**** DISABLE INTERRUPTS **** -- MOS46 0022 E7B6 ; -- MOS46 0023 E7B6 ; save A and X -- MOS46 0024 E7B6 ; -- MOS46 0025 E7B6 85 EF STA BYTEA -- MOS46 0026 E7B8 86 F0 STX BYTEX -- MOS46 0027 E7BA 84 F1 STY BYTEY -- MOS46 0028 E7BC ; -- MOS46 0029 E7BC A2 07 LDXIM SVBYTE ;illegal codes are referred to paged ROM -- MOS46 0030 E7BE ; -- MOS46 0031 E7BE ; check for legal code -- MOS46 0032 E7BE ; -- MOS46 0033 E7BE C9 75 CMPIM BYTEM -- MOS46 0034 E7C0 90 41 BCC BYTELO ;[interactive code] MOS46 0034 E7C0 v3E MOS46 0035 E7C2 ; MOS46 0034 E7C0 v3E MOS46 0036 E7C2 ; code >= BYTEM MOS46 0034 E7C0 v3E MOS46 0037 E7C2 ; MOS46 0034 E7C0 v3E MOS46 0038 E7C2 C9 A1 CMPIM BYTEH MOS46 0034 E7C0 v3E MOS46 0039 E7C4 90 09 BCC BYTEHI ;[code < BYTEH] MOS46 0034 E7C0 v3E MOS46 0040 E7C6 ; MOS46 0034 E7C0 v3E MOS46 0041 E7C6 ; check for variable setting MOS46 0034 E7C0 v3E MOS46 0042 E7C6 ; MOS46 0034 E7C0 v3E MOS46 0043 E7C6 C9 A6 CMPIM VORG MOS46 0034 E7C0 v3E MOS46 0044 E7C8 90 3F BCC BYTE0 ;[not a variable setting] MOS46 0034 E7C0 v3E MOS46 0045 E7CA ; MOS46 0034 E7C0 v3E MOS46 0046 E7CA ; set variable MOS46 0034 E7C0 v3E MOS46 0047 E7CA ; MOS46 0034 E7C0 v3E MOS46 0048 E7CA 18 CLC ;force A=BYTEH MOS46 0034 E7C0 v3E MOS46 0049 E7CB ; MOS46 0034 E7C0 v3E MOS46 0050 E7CB WORDU ;user OSWORD call, C=1, force A=BYTEH+$01 MOS46 0034 E7C0 v3E MOS46 0051 E7CB ; MOS46 0034 E7C0 v3E MOS46 0052 E7CB A9 A1 LDAIM BYTEH MOS46 0216 E82A ^1F MOS46 0053 E7CD 69 00 ADCIM ZERO ;add in carry (C=0 => variable, C=1 => user OSWORD) MOS46 0216 E82A ^1F MOS46 0054 E7CF ; MOS46 0216 E82A ^1F MOS46 0055 E7CF BYTEHI MOS46 0216 E82A ^1F MOS46 0056 E7CF ; MOS46 0216 E82A ^1F MOS46 0057 E7CF 38 SEC MOS46 0216 E82A ^1F MOS46 0058 E7D0 E9 5F SBCIM BYTEM-BYTEL MOS46 0216 E82A ^1F MOS46 0059 E7D2 ; MOS46 0216 E82A ^1F MOS46 0060 E7D2 BYTE1 ;construct address of specific OSBYTE routine MOS46 0216 E82A ^1F MOS46 0061 E7D2 ; MOS46 0216 E82A ^1F MOS46 0062 E7D2 0A ASLA ;prepare for Y := 2*code MOS46 0216 E82A ^1F MOS46 0063 E7D3 ; MOS46 0216 E82A ^1F MOS46 0064 E7D3 38 SEC ;indicate OSBYTE call MOS46 0216 E82A ^1F MOS46 0065 E7D4 ; MOS46 0216 E82A ^1F MOS46 0066 E7D4 BYTE2 ;C=0 => OSWORD call MOS46 0216 E82A ^1F MOS46 0067 E7D4 ; MOS46 0216 E82A ^1F MOS46 0068 E7D4 84 F1 STY BYTEY ;save Y MOS46 0216 E82A ^1F MOS46 0069 E7D6 ; MOS46 0216 E82A ^1F MOS46 0070 E7D6 A8 TAY ;Y := 2*code MOS46 0216 E82A ^1F MOS46 0071 E7D7 ; MOS46 0216 E82A ^1F MOS46 0072 E7D7 ; allow net to indirect OS call MOS46 0216 E82A ^1F MOS46 0073 E7D7 ; MOS46 0216 E82A ^1F MOS46 0074 E7D7 [ MOS125 = &FF MOS46 0216 E82A ^1F MOS46 0082 E7D7 | MOS46 0216 E82A ^1F MOS46 0083 E7D7 AD 5E 02 LDA NETIOC MOS46 0216 E82A ^1F MOS46 0084 E7DA B8 CLV MOS46 0216 E82A ^1F MOS46 0085 E7DB 10 06 BPL NET1 ;[net not indirecting OS calls] MOS46 0216 E82A ^1F MOS46 0086 E7DD ; MOS46 0216 E82A ^1F MOS46 0087 E7DD ; indirect OS call thru net MOS46 0216 E82A ^1F MOS46 0088 E7DD ; MOS46 0216 E82A ^1F MOS46 0089 E7DD 8A TXA ;A := reason code MOS46 0216 E82A ^1F MOS46 0090 E7DE ] MOS46 0216 E82A ^1F MOS46 0091 E7DE 20 C1 E5 JSR JMINET ;args in BYTEA, BYTEX, BYTEY (call type in A) MOS46 0216 E82A ^1F MOS46 0092 E7E1 70 1A BVS OSRET ;[net substituted result] MOS46 0216 E82A ^1F MOS46 0093 E7E3 ; MOS46 0216 E82A ^1F MOS46 0094 E7E3 ; construct specific OSBYTE routine address MOS46 0216 E82A ^1F MOS46 0095 E7E3 ; MOS46 0216 E82A ^1F MOS46 0096 E7E3 NET1 ;call internal routine MOS46 0216 E82A ^1F MOS46 0097 E7E3 B9 F7 E5 LDAAY BYTET+&01 ;hi-byte MOS46 0216 E82A ^1F MOS46 0098 E7E6 85 FB STA JMIHI MOS46 0216 E82A ^1F MOS46 0099 E7E8 B9 F6 E5 LDAAY BYTET+&00 ;lo-byte MOS46 0216 E82A ^1F MOS46 0100 E7EB 85 FA STA JMILO MOS46 0216 E82A ^1F MOS46 0101 E7ED ; MOS46 0216 E82A ^1F MOS46 0102 E7ED ; enter specific OSBYTE routine MOS46 0216 E82A ^1F MOS46 0103 E7ED ; MOS46 0216 E82A ^1F MOS46 0104 E7ED ; X = SVBYTE or SVWORD MOS46 0216 E82A ^1F MOS46 0105 E7ED ; MOS46 0216 E82A ^1F MOS46 0106 E7ED ; MOS46 0216 E82A ^1F MOS46 0107 E7ED A5 EF LDA BYTEA ;in case OSBYTE call MOS46 0216 E82A ^1F MOS46 0108 E7EF A4 F1 LDY BYTEY ;restore Y MOS46 0216 E82A ^1F MOS46 0109 E7F1 ; MOS46 0216 E82A ^1F MOS46 0110 E7F1 ; determine type of call MOS46 0216 E82A ^1F MOS46 0111 E7F1 ; MOS46 0216 E82A ^1F MOS46 0112 E7F1 B0 04 BCS OSB ;[OSBYTE call] MOS46 0216 E82A ^1F MOS46 0113 E7F3 ; MOS46 0216 E82A ^1F MOS46 0114 E7F3 ; OSWORD call MOS46 0216 E82A ^1F MOS46 0115 E7F3 ; MOS46 0216 E82A ^1F MOS46 0116 E7F3 A0 00 LDYIM ZERO MOS46 0216 E82A ^1F MOS46 0117 E7F5 B1 F0 LDAIY WORDX MOS46 0216 E82A ^1F MOS46 0118 E7F7 ; MOS46 0216 E82A ^1F MOS46 0119 E7F7 OSB MOS46 0216 E82A ^1F MOS46 0120 E7F7 ; MOS46 0216 E82A ^1F MOS46 0121 E7F7 ; ********** V=0 USED BY OSBYTE ROUTINES ********** MOS46 0216 E82A ^1F MOS46 0122 E7F7 38 SEC ;used by several routines MOS46 0216 E82A ^1F MOS46 0123 E7F8 A6 F0 LDX BYTEX ;restore X (N.B. N, Z status used by several routines) MOS46 0216 E82A ^1F MOS46 0124 E7FA 20 60 EA JSR JMI ;enter specific routine MOS46 0216 E82A ^1F MOS46 0125 E7FD ; MOS46 0216 E82A ^1F MOS46 0126 E7FD OSRET MOS46 0216 E82A ^1F MOS46 0127 E7FD ; MOS46 0216 E82A ^1F MOS46 0128 E7FD 6A RORA ;save C MOS46 0216 E82A ^1F MOS46 0129 E7FE 28 PLP MOS46 0216 E82A ^1F MOS46 0130 E7FF 2A ROLA ;restore C (needed by readline routine - BASIC expects it) MOS46 0216 E82A ^1F MOS46 0131 E800 68 PLA ;restore A MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 97 MOS46 MOS46 OSWORD routines MOS46 MOS46 0216 E82A ^1F MOS46 0132 E801 B8 CLV ;indicate call recognised MOS46 0216 E82A ^1F MOS46 0133 E802 60 RTS MOS46 0216 E82A ^1F MOS46 0134 E803 MOS46 0216 E82A ^1F MOS46 0135 E803 MOS46 0216 E82A ^1F MOS46 0136 E803 [ NOSP = &00 MOS46 0216 E82A ^1F MOS46 0141 E803 ] MOS46 0216 E82A ^1F MOS46 0142 E803 MOS46 0216 E82A ^1F MOS46 0143 E803 BYTELO ;code has top bit clear - use table lo component MOS46 0216 E82A ^1F MOS46 0144 E803 A0 00 LDYIM ZERO ;only one argument, set Y=0 for variable settings and ADC ops MOS46 0216 E82A ^1F MOS46 0145 E805 C9 16 CMPIM BYTEL MOS46 0216 E82A ^1F MOS46 0146 E807 90 C9 BCC BYTE1 ;[recognised code] MOS46 0216 E82A ^1F MOS46 0147 E809 ; MOS46 0216 E82A ^1F MOS46 0148 E809 ; unrecognised code MOS46 0216 E82A ^1F MOS46 0149 E809 ; MOS46 0216 E82A ^1F MOS46 0150 E809 BYTE0 ;unrecognised OSBYTE code MOS46 0216 E82A ^1F MOS46 0151 E809 WORD0 ;unrecognised OSWORD code (C=1) MOS46 0216 E82A ^1F MOS46 0152 E809 ; force 4 bytes on stack (making 4 before Preg, simulating a return link) MOS46 0216 E82A ^1F MOS46 0153 E809 08 PHP ;N.B. non-zero byte (SEI mode) MOS46 0216 E82A ^1F MOS46 0154 E80A 08 PHP MOS46 0216 E82A ^1F MOS46 0155 E80B ; MOS46 0216 E82A ^1F MOS46 0156 E80B EXTSND ;entry point used by SOUND (return link still on stack) MOS46 0216 E82A ^1F MOS46 0157 E80B 68 PLA MOS46 0216 E82A ^1F MOS46 0158 E80C 68 PLA MOS46 0216 E82A ^1F MOS46 0159 E80D ; MOS46 0216 E82A ^1F MOS46 0160 E80D 20 74 F1 JSR SVOP ;offer to paged ROMs (N.B. X=SVBYTE or X=SVWORD) MOS46 0216 E82A ^1F MOS46 0161 E810 D0 05 BNE BADOSC ;[unrecognised OS call] MOS46 0216 E82A ^1F MOS46 0162 E812 ; MOS46 0216 E82A ^1F MOS46 0163 E812 ; recognised OS call MOS46 0216 E82A ^1F MOS46 0164 E812 ; MOS46 0216 E82A ^1F MOS46 0165 E812 A6 F0 LDX BYTEX ;replace X (corrupted by SVOP) MOS46 0216 E82A ^1F MOS46 0166 E814 ; MOS46 0216 E82A ^1F MOS46 0167 E814 4C FD E7 JMP OSRET MOS46 0216 E82A ^1F MOS46 0168 E817 MOS46 0216 E82A ^1F MOS46 0169 E817 MOS46 0216 E82A ^1F MOS46 0170 E817 BADOSC ;bad OS call MOS46 0216 E82A ^1F MOS46 0171 E817 28 PLP ;restore interrupt status MOS46 0216 E82A ^1F MOS46 0172 E818 68 PLA ;restore code to return with MOS46 0216 E82A ^1F MOS46 0173 E819 2C 49 D9 BIT FFBYT ;indicate call not recognised MOS46 0216 E82A ^1F MOS46 0174 E81C 60 RTS MOS46 0216 E82A ^1F MOS46 0175 E81D MOS46 0216 E82A ^1F MOS46 0176 E81D MOS46 0216 E82A ^1F MOS46 0177 E81D [ MOS125 = &FF MOS46 0216 E82A ^1F MOS46 0193 E81D ] MOS46 0216 E82A ^1F MOS46 0194 E81D MOS46 0216 E82A ^1F MOS46 0195 E81D MOS46 0216 E82A ^1F MOS46 0196 E81D WORD ;OSWORD call MOS46 0216 E82A ^1F MOS46 0197 E81D ; uses: MOS46 0216 E82A ^1F MOS46 0198 E81D ; WORDX, WORDY (may be shared by sei-routines) MOS46 0216 E82A ^1F MOS46 0199 E81D ; JMILO, JMIHI (may be shared by sei-routines) MOS46 0216 E82A ^1F MOS46 0200 E81D ; MOS46 0216 E82A ^1F MOS46 0201 E81D 48 PHA MOS46 0216 E82A ^1F MOS46 0202 E81E 08 PHP ;save interrupt state MOS46 0216 E82A ^1F MOS46 0203 E81F 78 SEI ;**** DISABLE INTERRUPTS **** MOS46 0216 E82A ^1F MOS46 0204 E820 ; MOS46 0216 E82A ^1F MOS46 0205 E820 ; save A, X and Y MOS46 0216 E82A ^1F MOS46 0206 E820 ; MOS46 0216 E82A ^1F MOS46 0207 E820 85 EF STA WORDA MOS46 0216 E82A ^1F MOS46 0208 E822 86 F0 STX WORDX MOS46 0216 E82A ^1F MOS46 0209 E824 84 F1 STY WORDY MOS46 0216 E82A ^1F MOS46 0210 E826 ; MOS46 0216 E82A ^1F MOS46 0211 E826 A2 08 LDXIM SVWORD ;code used if indirection taken MOS46 0216 E82A ^1F MOS46 0212 E828 ; MOS46 0216 E82A ^1F MOS46 0213 E828 ; check for user OSWORD call MOS46 0216 E82A ^1F MOS46 0214 E828 ; MOS46 0216 E82A ^1F MOS46 0215 E828 C9 E0 CMPIM &E0 MOS46 0216 E82A ^1F MOS46 0216 E82A B0 9F BCS WORDU ;[user OSWORD call - route thru USRVEC, C=1] MOS46 0237 E833 ^1F MOS46 0217 E82C ; MOS46 0237 E833 ^1F MOS46 0218 E82C ; not a user OSWORD call MOS46 0237 E833 ^1F MOS46 0219 E82C ; MOS46 0237 E833 ^1F MOS46 0220 E82C ; check for legal code MOS46 0237 E833 ^1F MOS46 0221 E82C ; MOS46 0237 E833 ^1F MOS46 0222 E82C C9 0E CMPIM WORDN MOS46 0237 E833 ^1F MOS46 0223 E82E B0 D9 BCS WORD0 ;[unrecognised code] MOS46 0237 E833 ^1F MOS46 0224 E830 ; C=0 MOS46 0237 E833 ^1F MOS46 0225 E830 ; MOS46 0237 E833 ^1F MOS46 0226 E830 ; recognised OSWORD call MOS46 0237 E833 ^1F MOS46 0227 E830 ; construct address of specific OSWORD routine MOS46 0237 E833 ^1F MOS46 0228 E830 ; MOS46 0237 E833 ^1F MOS46 0229 E830 ; C=0 MOS46 0237 E833 ^1F MOS46 0230 E830 69 44 ADCIM WORDT-BYTET:SHR: 1 MOS46 0237 E833 ^1F MOS46 0231 E832 ; C=0 MOS46 0237 E833 ^1F MOS46 0232 E832 ; MOS46 0237 E833 ^1F MOS46 0233 E832 ; enter specific OSWORD routine MOS46 0237 E833 ^1F MOS46 0234 E832 ; MOS46 0237 E833 ^1F MOS46 0235 E832 0A ASLA ;prepare for Y := 2*code MOS46 0237 E833 ^1F MOS46 0236 E833 ; C=0 MOS46 0237 E833 ^1F MOS46 0237 E833 90 9F BCC BYTE2 ;[ALWAYS jump, C=0 => OSWORD call] MOS46 0316 E840 ^49 MOS46 0238 E835 MOS46 0316 E840 ^49 MOS46 0239 E835 [ MOS125 = &FF MOS46 0316 E840 ^49 MOS46 0277 E835 ] MOS46 0316 E840 ^49 MOS46 0278 E835 MOS46 0316 E840 ^49 MOS46 0279 E835 NOTE ;add note to note buffer MOS46 0316 E840 ^49 MOS46 0280 E835 ; ********************* MOS46 0316 E840 ^49 MOS46 0281 E835 ; MAY ENABLE INTERRUPTS MOS46 0316 E840 ^49 MOS46 0282 E835 ; ********************* MOS46 0316 E840 ^49 MOS46 0283 E835 ; XY -> 8 bytes of info MOS46 0316 E840 ^49 MOS46 0284 E835 ; C=1 MOS46 0316 E840 ^49 MOS46 0285 E835 ; X=SVWORD MOS46 0316 E840 ^49 MOS46 0286 E835 ; Y=0 MOS46 0316 E840 ^49 MOS46 0287 E835 ; MOS46 0316 E840 ^49 MOS46 0288 E835 [ NOSP = &00 MOS46 0316 E840 ^49 MOS46 0300 E835 | MOS46 0316 E840 ^49 MOS46 0301 E835 [ $Tutu MOS46 0316 E840 ^49 MOS46 0306 E835 | MOS46 0316 E840 ^49 MOS46 0307 E835 C8 INY MOS46 0316 E840 ^49 MOS46 0308 E836 B1 F0 LDAIY WORDX ;A := command type indicator (hi-byte of 1st argument) MOS46 0316 E840 ^49 MOS46 0309 E838 C9 FF CMPIM &FF MOS46 0316 E840 ^49 MOS46 0310 E83A ] MOS46 0316 E840 ^49 MOS46 0311 E83A F0 59 BEQ SPEECH ;[speech command] MOS46 0311 E83A v26 MOS46 0312 E83C C9 20 CMPIM &20 MOS46 0311 E83A v26 MOS46 0313 E83E ] MOS46 0311 E83A v26 MOS46 0314 E83E MOS46 0311 E83A v26 MOS46 0315 E83E A2 08 LDXIM SVWORD ;in case EXTSND called MOS46 0311 E83A v26 MOS46 0316 E840 B0 C9 BCS EXTSND ;[route command to paged ROM] MOS46 0311 E83A v26 MOS46 0317 E842 ; MOS46 0311 E83A v26 MOS46 0318 E842 ; sound command MOS46 0311 E83A v26 MOS46 0319 E842 ; MOS46 0311 E83A v26 MOS46 0320 E842 88 DEY ;Y := 0 MOS46 0311 E83A v26 MOS46 0321 E843 20 CD E8 JSR NOTEX ;C => flush, A = channel, Y := 1 MOS46 0311 E83A v26 MOS46 0322 E846 09 04 ORAIM &04 ;********** N.B. assumes BSND1=4 MOS46 0311 E83A v26 MOS46 0323 E848 AA TAX ;X := (internal) sound bufferid MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 98 MOS46 MOS46 OSWORD routines MOS46 MOS46 0311 E83A v26 MOS46 0324 E849 90 05 BCC NOTENF ;[do not flush channel] MOS46 0311 E83A v26 MOS46 0325 E84B ; C=1 MOS46 0311 E83A v26 MOS46 0326 E84B ; flush channel MOS46 0311 E83A v26 MOS46 0327 E84B ; MOS46 0311 E83A v26 MOS46 0328 E84B ; C=1 MOS46 0311 E83A v26 MOS46 0329 E84B 20 FE E1 JSR PURGEX ;purge buffer MOS46 0311 E83A v26 MOS46 0330 E84E A0 01 LDYIM &01 ;restore Y MOS46 0311 E83A v26 MOS46 0331 E850 ; MOS46 0311 E83A v26 MOS46 0332 E850 NOTENF MOS46 0311 E83A v26 MOS46 0333 E850 20 CD E8 JSR NOTEX ;C => release continue, A = chordcount-1 MOS46 0311 E83A v26 MOS46 0334 E853 85 FA STA NOTEWK MOS46 0311 E83A v26 MOS46 0335 E855 ; MOS46 0311 E83A v26 MOS46 0336 E855 08 PHP ;needed in order to share code with BELL MOS46 0311 E83A v26 MOS46 0337 E856 A0 06 LDYIM &06 ;A := duration-lo MOS46 0311 E83A v26 MOS46 0338 E858 B1 F0 LDAIY WORDX MOS46 0311 E83A v26 MOS46 0339 E85A 48 PHA MOS46 0311 E83A v26 MOS46 0340 E85B ; MOS46 0311 E83A v26 MOS46 0341 E85B A0 04 LDYIM &04 ;A := note-lo MOS46 0311 E83A v26 MOS46 0342 E85D B1 F0 LDAIY WORDX MOS46 0311 E83A v26 MOS46 0343 E85F 48 PHA MOS46 0311 E83A v26 MOS46 0344 E860 ; MOS46 0311 E83A v26 MOS46 0345 E860 ; C => release continue MOS46 0311 E83A v26 MOS46 0346 E860 ; MOS46 0311 E83A v26 MOS46 0347 E860 A0 02 LDYIM &02 MOS46 0311 E83A v26 MOS46 0348 E862 B1 F0 LDAIY WORDX ;A = envelope-lo MOS46 0311 E83A v26 MOS46 0349 E864 2A ROLA ;rotate in release continue bit MOS46 0311 E83A v26 MOS46 0350 E865 38 SEC MOS46 0311 E83A v26 MOS46 0351 E866 E9 02 SBCIM &02 ;envelope numbers start at 1 MOS46 0311 E83A v26 MOS46 0352 E868 0A ASLA MOS46 0311 E83A v26 MOS46 0353 E869 0A ASLA ;rotate in 2 zero bits MOS46 0311 E83A v26 MOS46 0354 E86A 05 FA ORA NOTEWK ;A := AEEE ERHH MOS46 0311 E83A v26 MOS46 0355 E86C ; MOS46 0311 E83A v26 MOS46 0356 E86C ; insert byte into buffer, waiting if necessary MOS46 0311 E83A v26 MOS46 0357 E86C ; MOS46 0311 E83A v26 MOS46 0358 E86C 20 49 E2 JSR WRITE MOS46 0311 E83A v26 MOS46 0359 E86F 90 1E BCC NOTE2 ;[byte inserted] MOS46 0311 E83A v26 MOS46 0360 E871 ; MOS46 0311 E83A v26 MOS46 0361 E871 SPESC ;ESCAPE detected MOS46 0311 E83A v26 MOS46 0362 E871 68 PLA MOS46 0311 E83A v26 MOS46 0363 E872 68 PLA MOS46 0311 E83A v26 MOS46 0364 E873 28 PLP MOS46 0311 E83A v26 MOS46 0365 E874 ; MOS46 0311 E83A v26 MOS46 0366 E874 VDUST ;FX call to return VDU status MOS46 0311 E83A v26 MOS46 0367 E874 A6 D0 LDX STATS MOS46 0311 E83A v26 MOS46 0368 E876 ; MOS46 0311 E83A v26 MOS46 0369 E876 60 RTS MOS46 0311 E83A v26 MOS46 0370 E877 MOS46 0311 E83A v26 MOS46 0371 E877 MOS46 0311 E83A v26 MOS46 0372 E877 ; MOS46 0311 E83A v26 MOS46 0373 E877 ;; ===== MOS46 0311 E83A v26 MOS46 0374 E877 ; BELL MOS46 0311 E83A v26 MOS46 0375 E877 ; ===== MOS46 0311 E83A v26 MOS46 0376 E877 ; MOS46 0311 E83A v26 MOS46 0377 E877 ; Add BELL to sound queue MOS46 0311 E83A v26 MOS46 0378 E877 ; MOS46 0311 E83A v26 MOS46 0379 E877 ; ENTRY:- No conditions MOS46 0311 E83A v26 MOS46 0380 E877 ; MOS46 0311 E83A v26 MOS46 0381 E877 ; EXIT:- A,X,Y Corrupted MOS46 0311 E83A v26 MOS46 0382 E877 ; Flags preserved MOS46 0311 E83A v26 MOS46 0383 E877 ; MOS46 0311 E83A v26 MOS46 0384 E877 BELL MOS46 0311 E83A v26 MOS46 0385 E877 08 PHP MOS46 0311 E83A v26 MOS46 0386 E878 78 SEI MOS46 0311 E83A v26 MOS46 0387 E879 ; MOS46 0311 E83A v26 MOS46 0388 E879 ; try to add bell to sound channel queue MOS46 0311 E83A v26 MOS46 0389 E879 ; MOS46 0311 E83A v26 MOS46 0390 E879 AD 63 02 LDA BELLC MOS46 0311 E83A v26 MOS46 0391 E87C 29 07 ANDIM &07 MOS46 0311 E83A v26 MOS46 0392 E87E 09 04 ORAIM &04 MOS46 0311 E83A v26 MOS46 0393 E880 AA TAX ;force valid sound channel MOS46 0311 E83A v26 MOS46 0394 E881 ; MOS46 0311 E83A v26 MOS46 0395 E881 ; insert envelope/chord info MOS46 0311 E83A v26 MOS46 0396 E881 ; MOS46 0311 E83A v26 MOS46 0397 E881 AD 64 02 LDA BELLI MOS46 0311 E83A v26 MOS46 0398 E884 20 F4 E4 JSR INSRT MOS46 0311 E83A v26 MOS46 0399 E887 ; MOS46 0311 E83A v26 MOS46 0400 E887 ; N.B. ignore return code MOS46 0311 E83A v26 MOS46 0401 E887 ; C=0 => inserted, C=1 => not inserted MOS46 0311 E83A v26 MOS46 0402 E887 ; if first INSRT failed then so will the following INSRTs MOS46 0311 E83A v26 MOS46 0403 E887 ; set to insert duration MOS46 0311 E83A v26 MOS46 0404 E887 ; MOS46 0311 E83A v26 MOS46 0405 E887 AD 66 02 LDA BELLD MOS46 0311 E83A v26 MOS46 0406 E88A 48 PHA MOS46 0311 E83A v26 MOS46 0407 E88B ; MOS46 0311 E83A v26 MOS46 0408 E88B ; set to insert note MOS46 0311 E83A v26 MOS46 0409 E88B ; MOS46 0311 E83A v26 MOS46 0410 E88B AD 65 02 LDA BELLN MOS46 0311 E83A v26 MOS46 0411 E88E 48 PHA MOS46 0311 E83A v26 MOS46 0412 E88F ; MOS46 0311 E83A v26 MOS46 0413 E88F NOTE2 ;buffer slot available MOS46 0311 E83A v26 MOS46 0414 E88F ; C=0 => inserted, C=1 => not inserted MOS46 0311 E83A v26 MOS46 0415 E88F ; MOS46 0311 E83A v26 MOS46 0416 E88F 38 SEC MOS46 0311 E83A v26 MOS46 0417 E890 7E 00 08 RORAX MACTIV-BSND1 MOS46 0311 E83A v26 MOS46 0418 E893 [ NOSP = &00 MOS46 0311 E83A v26 MOS46 0420 E893 | MOS46 0311 E83A v26 MOS46 0421 E893 30 17 BMI NOTE3 ;[ALWAYS JUMP] MOS46 0311 E83A v26 MOS46 0422 E895 ; MOS46 0311 E83A v26 MOS46 0423 E895 SPEECH ;SOUND -1,x,y,z command MOS46 0311 E83A v26 MOS46 0424 E895 ; Y=1 MOS46 0311 E83A v26 MOS46 0425 E895 08 PHP ;needed to share code with BELL MOS46 0438 E8A7 ^48 MOS46 0426 E896 C8 INY ;Y := $02 MOS46 0438 E8A7 ^48 MOS46 0427 E897 B1 F0 LDAIY WORDX MOS46 0438 E8A7 ^48 MOS46 0428 E899 48 PHA MOS46 0438 E8A7 ^48 MOS46 0429 E89A ; MOS46 0438 E8A7 ^48 MOS46 0430 E89A C8 INY ;Y := $03 MOS46 0438 E8A7 ^48 MOS46 0431 E89B B1 F0 LDAIY WORDX MOS46 0438 E8A7 ^48 MOS46 0432 E89D 48 PHA MOS46 0438 E8A7 ^48 MOS46 0433 E89E ; MOS46 0438 E8A7 ^48 MOS46 0434 E89E A0 00 LDYIM ZERO MOS46 0438 E8A7 ^48 MOS46 0435 E8A0 B1 F0 LDAIY WORDX MOS46 0438 E8A7 ^48 MOS46 0436 E8A2 A2 08 LDXIM BSPCH MOS46 0438 E8A7 ^48 MOS46 0437 E8A4 20 49 E2 JSR WRITE ;insert first byte into buffer MOS46 0438 E8A7 ^48 MOS46 0438 E8A7 B0 C8 BCS SPESC ;[escape detected] MOS46 0421 E893 v68 MOS46 0439 E8A9 ; MOS46 0421 E893 v68 MOS46 0440 E8A9 ; C=0 MOS46 0421 E893 v68 MOS46 0441 E8A9 ; MOS46 0421 E893 v68 MOS46 0442 E8A9 6E D7 02 ROR SPSTAT ;indicate speech buffer non-empty MOS46 0421 E893 v68 MOS46 0443 E8AC ] MOS46 0421 E893 v68 MOS46 0444 E8AC ; MOS46 0421 E893 v68 MOS46 0445 E8AC NOTE3 ;add note and duration (ignored if first byte not inserted) MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 99 MOS46 MOS46 OSWORD routines MOS46 MOS46 0421 E893 v68 MOS46 0446 E8AC 68 PLA -- MOS46 0447 E8AD 20 F4 E4 JSR INSRT ;add note data to queue -- MOS46 0448 E8B0 68 PLA -- MOS46 0449 E8B1 20 F4 E4 JSR INSRT ;add duration info to queue -- MOS46 0450 E8B4 28 PLP -- MOS46 0451 E8B5 60 RTS -- MOS46 0452 E8B6 -- MOS46 0453 E8B6 -- MOS46 0454 E8B6 NVLP ;define envelope shape -- MOS46 0455 E8B6 ; A := envelope number -- MOS46 0456 E8B6 ; C=1 -- MOS46 0457 E8B6 ; -- MOS46 0458 E8B6 [ MOS125 = &FF -- MOS46 0470 E8B6 | -- MOS46 0471 E8B6 ; -- MOS46 0472 E8B6 ; envelope number forced into range 0 to 15 (1->0, 2->1 ... 16->15) -- MOS46 0473 E8B6 ; (0 forced to 255, which will have the same effect as 15) -- MOS46 0474 E8B6 ; -- MOS46 0475 E8B6 0A ASLA -- MOS46 0476 E8B7 0A ASLA -- MOS46 0477 E8B8 0A ASLA -- MOS46 0478 E8B9 0A ASLA ;envelope number := envelope number * 16 -- MOS46 0479 E8BA AA TAX ;N.B. ENVSIZ must be 16! -- MOS46 0480 E8BB ] -- MOS46 0481 E8BB ; -- MOS46 0482 E8BB ; copy envelope definition to envelope slot -- MOS46 0483 E8BB ; padding to 16 bytes with zeroes -- MOS46 0484 E8BB ; -- MOS46 0485 E8BB A9 00 LDAIM ZERO ;padding value -- MOS46 0486 E8BD A0 10 LDYIM ENVSIZ -- MOS46 0487 E8BF ; -- MOS46 0488 E8BF NVLP1 -- MOS46 0489 E8BF C0 0E CPYIM ENVSIZ-&02 MOS46 0502 E8CA ^73 MOS46 0490 E8C1 B0 02 BCS NVLP2 ;[still padding] MOS46 0502 E8CA ^73 MOS46 0491 E8C3 ; MOS46 0502 E8CA ^73 MOS46 0492 E8C3 B1 F0 LDAIY WORDX MOS46 0502 E8CA ^73 MOS46 0493 E8C5 NVLP2 MOS46 0502 E8CA ^73 MOS46 0494 E8C5 [ MOS125 = &FF MOS46 0502 E8CA ^73 MOS46 0497 E8C5 | MOS46 0502 E8CA ^73 MOS46 0498 E8C5 CA DEX MOS46 0502 E8CA ^73 MOS46 0499 E8C6 9D C0 08 STAAX ENVEL MOS46 0502 E8CA ^73 MOS46 0500 E8C9 ] MOS46 0502 E8CA ^73 MOS46 0501 E8C9 88 DEY MOS46 0502 E8CA ^73 MOS46 0502 E8CA D0 F3 BNE NVLP1 -- MOS46 0503 E8CC ; -- MOS46 0504 E8CC 60 RTS -- MOS46 0505 E8CD -- MOS46 0506 E8CD NOTEX ;extract byte info from offset Y of vector -- MOS46 0507 E8CD B1 F0 LDAIY WORDX -- MOS46 0508 E8CF C9 10 CMPIM &10 ;C => flag (flush or release continue) -- MOS46 0509 E8D1 29 03 ANDIM &03 -- MOS46 0510 E8D3 C8 INY ;step Y to next slot -- MOS46 0511 E8D4 60 RTS -- MOS46 0512 E8D5 -- MOS46 0513 E8D5 RITM ;read interval time -- MOS46 0514 E8D5 A2 0F LDXIM STPW+&5-TIME -- MOS46 0515 E8D7 D0 03 BNE RTM ;[ALWAYS jump] MOS46 0515 E8D7 v7C MOS46 0516 E8D9 ; NEVER fall thru MOS46 0515 E8D7 v7C MOS46 0517 E8D9 RATM ;read absolute time MOS46 0515 E8D7 v7C MOS46 0518 E8D9 AE 83 02 LDX TIMESW MOS46 0515 E8D7 v7C MOS46 0519 E8DC RTM MOS46 0515 E8D7 v7C MOS46 0520 E8DC A0 04 LDYIM &04 -- MOS46 0521 E8DE RTM1 -- MOS46 0522 E8DE BD 8D 02 LDAAX TIME -&05 MOS46 0526 E8E5 ^77 MOS46 0523 E8E1 91 F0 STAIY WORDX MOS46 0526 E8E5 ^77 MOS46 0524 E8E3 E8 INX MOS46 0526 E8E5 ^77 MOS46 0525 E8E4 88 DEY MOS46 0526 E8E5 ^77 MOS46 0526 E8E5 10 F7 BPL RTM1 -- MOS46 0527 E8E7 WTM0 -- MOS46 0528 E8E7 60 RTS MOS46 0558 E8FD ^68 MOS46 0529 E8E8 MOS46 0558 E8FD ^68 MOS46 0530 E8E8 [ MOS125 = &FF MOS46 0558 E8FD ^68 MOS46 0539 E8E8 | MOS46 0558 E8FD ^68 MOS46 0540 E8E8 WATM ;write absolute time MOS46 0558 E8FD ^68 MOS46 0541 E8E8 AC 83 02 LDY TIMESW MOS46 0558 E8FD ^68 MOS46 0542 E8EB 18 CLC ;indicate WATM entry MOS46 0558 E8FD ^68 MOS46 0543 E8EC WITM ;write interval time, C=1, Y=0 MOS46 0558 E8FD ^68 MOS46 0544 E8EC 98 TYA MOS46 0558 E8FD ^68 MOS46 0545 E8ED 49 0F EORIM &0F ;assumes STPW-TIME = &A MOS46 0558 E8FD ^68 MOS46 0546 E8EF ] MOS46 0558 E8FD ^68 MOS46 0547 E8EF WTM MOS46 0558 E8FD ^68 MOS46 0548 E8EF 48 PHA ;save TIMESW for WATM entry MOS46 0558 E8FD ^68 MOS46 0549 E8F0 AA TAX MOS46 0558 E8FD ^68 MOS46 0550 E8F1 A0 04 LDYIM &04 MOS46 0558 E8FD ^68 MOS46 0551 E8F3 WTM1 MOS46 0558 E8FD ^68 MOS46 0552 E8F3 B1 F0 LDAIY WORDX MOS46 0558 E8FD ^68 MOS46 0553 E8F5 9D 8D 02 STAAX TIME -&05 MOS46 0558 E8FD ^68 MOS46 0554 E8F8 E8 INX MOS46 0558 E8FD ^68 MOS46 0555 E8F9 88 DEY MOS46 0558 E8FD ^68 MOS46 0556 E8FA 10 F7 BPL WTM1 MOS46 0558 E8FD ^68 MOS46 0557 E8FC 68 PLA MOS46 0558 E8FD ^68 MOS46 0558 E8FD B0 E8 BCS WTM0 ;[not WATM entry, do not reset TIMESW] -- MOS46 0559 E8FF ; WATM entry, reset TIMESW -- MOS46 0560 E8FF 8D 83 02 STA TIMESW -- MOS46 0561 E902 60 RTS -- MOS46 0562 E903 -- MOS46 0563 E903 RDLN ;read input buffer -- MOS46 0564 E903 ; ****************** -- MOS46 0565 E903 ; ENABLES INTERRUPTS -- MOS46 0566 E903 ; ****************** -- MOS46 0567 E903 ;**************** -- MOS46 0568 E903 ;variables: -- MOS46 0569 E903 ;zero page: RDLNX, RDLNY (contiguous) -- MOS46 0570 E903 ;other page: RDLNN, RDLNLC, RDLNHC (contiguous) -- MOS46 0571 E903 ;**************** -- MOS46 0572 E903 ;Called with Y and X the high and low addresses of the information -- MOS46 0573 E903 ;describing what is to be done. The bytes in order are: -- MOS46 0574 E903 ;lsb address of buffer -- MOS46 0575 E903 ;msb address of buffer -- MOS46 0576 E903 ;maximum length allowed -- MOS46 0577 E903 ;minimum character value to be stored in buffer -- MOS46 0578 E903 ;maximum character value to be stored in buffer -- MOS46 0579 E903 ;Return when escape is pressed or seen with CARRY SET -- MOS46 0580 E903 ;Return after CR (which is always stored) with CARRY CLEAR -- MOS46 0581 E903 ;Always returns with Y the number of characters in the buffer -- MOS46 0582 E903 ;DEL,ESC and NAK are always processed -- MOS46 0583 E903 ;**** NOTE **** -- MOS46 0584 E903 ; if the 'other page' variables are put into page zero -- MOS46 0585 E903 ; this routine can be made ~10 bytes shorter. -- MOS46 0586 E903 ; however, an extra pointer variable in page zero would -- MOS46 0587 E903 ; then be required. MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 100 MOS46 MOS46 OSWORD routines MOS46 -- MOS46 0588 E903 ; this routine enables interrupts -- MOS46 0589 E903 ; ********** -- MOS46 0590 E903 ; copy 'other page' values -- MOS46 0591 E903 -- MOS46 0592 E903 A0 04 LDYIM &04 -- MOS46 0593 E905 BUFFPR -- MOS46 0594 E905 B1 F0 LDAIY WORDX MOS46 0598 E90D ^76 MOS46 0595 E907 99 B1 02 STAAY RDLNN -&02 ;N.B. offset of -02 MOS46 0598 E90D ^76 MOS46 0596 E90A 88 DEY MOS46 0598 E90D ^76 MOS46 0597 E90B C0 02 CPYIM &02 MOS46 0598 E90D ^76 MOS46 0598 E90D B0 F6 BCS BUFFPR ;[more arguments to copy] -- MOS46 0599 E90F ; -- MOS46 0600 E90F ; C=0, Y=1 -- MOS46 0601 E90F ; copy buffer pointer -- MOS46 0602 E90F ; -- MOS46 0603 E90F B1 F0 LDAIY WORDX ;hi-byte -- MOS46 0604 E911 85 E9 STA RDLNBF +&01 -- MOS46 0605 E913 88 DEY ;Y := 0 -- MOS46 0606 E914 8C 69 02 STY LINES ;reset page mode page origin -- MOS46 0607 E917 B1 F0 LDAIY WORDX ;lo-byte -- MOS46 0608 E919 85 E8 STA RDLNBF +&00 -- MOS46 0609 E91B ; -- MOS46 0610 E91B ; C=0, Y=0 -- MOS46 0611 E91B ; -- MOS46 0612 E91B 58 CLI ;**** ENABLE INTERRUPTS **** -- MOS46 0613 E91C 90 1F BCC BUFFIN ;[ALWAYS JUMP] MOS46 0613 E91C v60 MOS46 0614 E91E ; MOS46 0613 E91C v60 MOS46 0615 E91E ; NEVER fall thru MOS46 0613 E91C v60 MOS46 0616 E91E MOS46 0613 E91C v60 MOS46 0617 E91E MOS46 0613 E91C v60 MOS46 0618 E91E [ MOS125 = &FF MOS46 0613 E91C v60 MOS46 0622 E91E | MOS46 0613 E91C v60 MOS46 0623 E91E A9 07 BUFEXH LDAIM BEL ;reflect bell to indicate error MOS46 0613 E91C v60 MOS46 0624 E920 D0 18 BNE BUFIGN ;ALWAYS jump MOS46 0613 E91C v60 MOS46 0625 E922 MOS46 0613 E91C v60 MOS46 0626 E922 BUFNXB ;check for ESC explicitly in case machine in non ESC mode MOS46 0613 E91C v60 MOS46 0627 E922 ;CMPIM ESC MOS46 0613 E91C v60 MOS46 0628 E922 ;BEQ BUFESC ;[ESC, N.B. C = 1] MOS46 0613 E91C v60 MOS46 0629 E922 ; not DEL, NAK or ESC MOS46 0613 E91C v60 MOS46 0630 E922 91 E8 STAIY RDLNBF ;store character in buffer MOS46 0702 E956 ^4A MOS46 0631 E924 C9 0D CMPIM MCR MOS46 0702 E956 ^4A MOS46 0632 E926 F0 3F BEQ BUFEND ;[CR detected, exit indicating CR received] MOS46 0632 E926 v40 MOS46 0633 E928 CC B3 02 CPY RDLNN MOS46 0632 E926 v40 MOS46 0634 E92B B0 F1 BCS BUFEXH ;[buffer exhausted, do not echo character] MOS46 0632 E926 v40 MOS46 0635 E92D ; MOS46 0632 E926 v40 MOS46 0636 E92D ; buffer not exhausted MOS46 0632 E926 v40 MOS46 0637 E92D ; MOS46 0632 E926 v40 MOS46 0638 E92D CD B4 02 CMP RDLNLC MOS46 0632 E926 v40 MOS46 0639 E930 90 08 BCC BUFIGN ;[character < lo-character] MOS46 0632 E926 v40 MOS46 0640 E932 CD B5 02 CMP RDLNHC MOS46 0632 E926 v40 MOS46 0641 E935 90 02 BCC BUFECH ;[character < hi-character, so accept] MOS46 0632 E926 v40 MOS46 0642 E937 D0 01 BNE BUFIGN ;[character > hi-character, so ignore] MOS46 0632 E926 v40 MOS46 0643 E939 C8 BUFECH INY ;increment count of characters in buffer MOS46 0632 E926 v40 MOS46 0644 E93A BUFIGN MOS46 0632 E926 v40 MOS46 0645 E93A ] MOS46 0632 E926 v40 MOS46 0646 E93A ; echo character MOS46 0632 E926 v40 MOS46 0647 E93A BFWRCH MOS46 0632 E926 v40 MOS46 0648 E93A 20 EE FF JSR OSWRCH MOS46 0632 E926 v40 MOS46 0649 E93D ; MOS46 0632 E926 v40 MOS46 0650 E93D BUFFIN ;main loop MOS46 0632 E926 v40 MOS46 0651 E93D 20 E0 FF JSR OSRDCH ;read a character MOS46 0632 E926 v40 MOS46 0652 E940 B0 2B BCS BUFESC ;[escape detected] MOS46 0632 E926 v40 MOS46 0653 E942 AA TAX MOS46 0632 E926 v40 MOS46 0654 E943 AD 7C 02 LDA WRCHSW MOS46 0632 E926 v40 MOS46 0655 E946 6A RORA MOS46 0632 E926 v40 MOS46 0656 E947 6A RORA MOS46 0632 E926 v40 MOS46 0657 E948 8A TXA MOS46 0632 E926 v40 MOS46 0658 E949 B0 05 BCS BUFNQ ;[output does not include VDU] MOS46 0632 E926 v40 MOS46 0659 E94B ; MOS46 0632 E926 v40 MOS46 0660 E94B ; output includes VDU MOS46 0632 E926 v40 MOS46 0661 E94B ; MOS46 0632 E926 v40 MOS46 0662 E94B ; MOS46 0632 E926 v40 MOS46 0663 E94B AE 6A 02 LDX QPOSN MOS46 0632 E926 v40 MOS46 0664 E94E D0 EA BNE BFWRCH ;[VDU queueing, reflect character] MOS46 0632 E926 v40 MOS46 0665 E950 ; MOS46 0632 E926 v40 MOS46 0666 E950 ; output does not include VDU MOS46 0632 E926 v40 MOS46 0667 E950 ; MOS46 0632 E926 v40 MOS46 0668 E950 BUFNQ ;VDU not queueing MOS46 0632 E926 v40 MOS46 0669 E950 [ MOS125 = &FF MOS46 0632 E926 v40 MOS46 0698 E950 | MOS46 0632 E926 v40 MOS46 0699 E950 C9 7F CMPIM MDEL MOS46 0632 E926 v40 MOS46 0700 E952 F0 05 BEQ BUFCNL ;[DEL received] MOS46 0632 E926 v40 MOS46 0701 E954 C9 15 CMPIM MNAK MOS46 0632 E926 v40 MOS46 0702 E956 D0 CA BNE BUFNXB ;[not DEL or NAK] MOS46 0632 E926 v40 MOS46 0703 E958 18 CLC MOS46 0632 E926 v40 MOS46 0704 E959 BUFCNL ;output DEL once (CC) or for each character in the buffer MOS46 0632 E926 v40 MOS46 0705 E959 98 TYA MOS46 0632 E926 v40 MOS46 0706 E95A F0 E1 BEQ BUFFIN ;[reached start of line] MOS46 0632 E926 v40 MOS46 0707 E95C 88 DEY MOS46 0632 E926 v40 MOS46 0708 E95D A9 7F LDAIM MDEL MOS46 0632 E926 v40 MOS46 0709 E95F B0 D9 BCS BFWRCH ;[if DEL, reflect DEL and get next char] MOS46 0632 E926 v40 MOS46 0710 E961 20 EE FF JSR OSWRCH MOS46 0632 E926 v40 MOS46 0711 E964 18 CLC MOS46 0632 E926 v40 MOS46 0712 E965 90 F2 BCC BUFCNL ;[ALWAYS jump, more characters to delete] MOS46 0632 E926 v40 MOS46 0713 E967 ] MOS46 0632 E926 v40 MOS46 0714 E967 ; NEVER fall thru MOS46 0632 E926 v40 MOS46 0715 E967 ; MOS46 0632 E926 v40 MOS46 0716 E967 [ MOS125 = &FF MOS46 0632 E926 v40 MOS46 0736 E967 ] MOS46 0632 E926 v40 MOS46 0737 E967 MOS46 0632 E926 v40 MOS46 0738 E967 BUFEND ;read line successful MOS46 0632 E926 v40 MOS46 0739 E967 ; echo LF CR MOS46 0632 E926 v40 MOS46 0740 E967 20 E7 FF JSR OSNEWL MOS46 0652 E940 v54 MOS46 0741 E96A 20 C1 E5 JSR JMINET ;N.B. assumes NTCR has value $0D MOS46 0652 E940 v54 MOS46 0742 E96D ; MOS46 0652 E940 v54 MOS46 0743 E96D BUFESC ;escape exit (C=1) MOS46 0652 E940 v54 MOS46 0744 E96D A5 FF LDA ESCFLG -- MOS46 0745 E96F 2A ROLA ;C=0 => no escape, C=1 => escape -- MOS46 0746 E970 60 RTS -- MOS46 0747 E971 -- MOS46 0748 E971 -- MOS46 0749 E971 [ MOS125 = &7F -- MOS46 0750 E971 ;flash keyboard LEDs while waiting for printer buffer to purge -- MOS46 0751 E971 ;C=1 -- MOS46 0752 E971 SPFL -- MOS46 0753 E971 [ STARGO = &00 -- MOS46 0754 E971 48 PHA ;save FX call number MOS46 0775 E984 ^6B MOS46 0755 E972 8A TXA MOS46 0775 E984 ^6B MOS46 0756 E973 48 PHA ;save printer selection MOS46 0775 E984 ^6B MOS46 0757 E974 20 DE E9 JSR MOSTST ;flash LEDs MOS46 0775 E984 ^6B MOS46 0758 E977 68 PLA MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 101 MOS46 MOS46 OSWORD routines MOS46 MOS46 0775 E984 ^6B MOS46 0759 E978 AA TAX ;restore printer selection MOS46 0775 E984 ^6B MOS46 0760 E979 68 PLA ;restore FX call number MOS46 0775 E984 ^6B MOS46 0761 E97A 38 SEC ;restore C=1 MOS46 0775 E984 ^6B MOS46 0762 E97B ] MOS46 0775 E984 ^6B MOS46 0763 E97B ] MOS46 0775 E984 ^6B MOS46 0764 E97B MOS46 0775 E984 ^6B MOS46 0765 E97B SPRINT ;change printer selection (*FX 5) MOS46 0775 E984 ^6B MOS46 0766 E97B ; allow interrupts during wait, this means that: MOS46 0775 E984 ^6B MOS46 0767 E97B ; (a) the printer can purge AND/OR MOS46 0775 E984 ^6B MOS46 0768 E97B ; (b) escape can be detected MOS46 0775 E984 ^6B MOS46 0769 E97B 58 CLI MOS46 0775 E984 ^6B MOS46 0770 E97C 78 SEI MOS46 0775 E984 ^6B MOS46 0771 E97D 24 FF BIT ESCFLG MOS46 0775 E984 ^6B MOS46 0772 E97F 30 30 BMI SPR0 ;[escape detected] MOS46 0772 E97F v4F MOS46 0773 E981 2C D2 02 BIT PFLAG MOS46 0772 E97F v4F MOS46 0774 E984 [ MOS125 = &7F MOS46 0772 E97F v4F MOS46 0775 E984 10 EB BPL SPFL ;printer busy, flash LEDs while purging MOS46 0772 E97F v4F MOS46 0776 E986 | MOS46 0772 E97F v4F MOS46 0778 E986 ] MOS46 0772 E97F v4F MOS46 0779 E986 ; mention change of printer to print routines MOS46 0772 E97F v4F MOS46 0780 E986 20 F4 E1 JSR UPTX ;N.B. Y corrupted MOS46 0772 E97F v4F MOS46 0781 E989 ; interrupts may have corrupted BYTEX and BYTEY, so restore them MOS46 0772 E97F v4F MOS46 0782 E989 A0 00 LDYIM ZERO ;Y altered by call to UPTX MOS46 0772 E97F v4F MOS46 0783 E98B 84 F1 STY BYTEY MOS46 0772 E97F v4F MOS46 0784 E98D ; N.B. X reset at SETVX MOS46 0772 E97F v4F MOS46 0785 E98D ; N.B. A not altered since SPRINT MOS46 0772 E97F v4F MOS46 0786 E98D ; MOS46 0772 E97F v4F MOS46 0787 E98D V2B156 ;convert FX 1,5,6 to FX 241,245,246 MOS46 0772 E97F v4F MOS46 0788 E98D 09 F0 ORAIM &F0 MOS46 0772 E97F v4F MOS46 0789 E98F D0 0E BNE SETVX ;[ALWAYS jump] MOS46 0772 E97F v4F MOS46 0790 E991 ; MOS46 0772 E97F v4F MOS46 0791 E991 ARRPT ;A = $0C, set auto-repeat repeat count MOS46 0772 E97F v4F MOS46 0792 E991 ; N.B. previous instruction was LDX MOS46 0772 E97F v4F MOS46 0793 E991 ; C=1 MOS46 0772 E97F v4F MOS46 0794 E991 D0 07 BNE ARRPT1 ;[X<>0 => do not set defaults] MOS46 0772 E97F v4F MOS46 0795 E993 ; set defaults MOS46 0772 E97F v4F MOS46 0796 E993 A2 32 LDXIM DAUTOD MOS46 0772 E97F v4F MOS46 0797 E995 8E 54 02 STX FARSET MOS46 0772 E97F v4F MOS46 0798 E998 A2 08 LDXIM DAUTOP MOS46 0772 E97F v4F MOS46 0799 E99A ARRPT1 ;A = $0C, C=1 MOS46 0772 E97F v4F MOS46 0800 E99A ARDLY ;A = $0B, C=1, set auto-repeat delay count (0 => disable) MOS46 0772 E97F v4F MOS46 0801 E99A 69 CF ADCIM FARSET-VBASE-&01-&0B- 233 ;$01 for carry, $0B for FX base MOS46 0772 E97F v4F MOS46 0802 E99C ; MOS46 0772 E97F v4F MOS46 0803 E99C V2B34 ;C=1 MOS46 0772 E97F v4F MOS46 0804 E99C 18 CLC MOS46 0772 E97F v4F MOS46 0805 E99D 69 E9 ADCIM 233 ;convert FX 3&4 to FX 236,237 MOS46 0772 E97F v4F MOS46 0806 E99F ; MOS46 0772 E97F v4F MOS46 0807 E99F SETVX MOS46 0772 E97F v4F MOS46 0808 E99F 86 F0 STX BYTEX MOS46 0772 E97F v4F MOS46 0809 E9A1 ; MOS46 0772 E97F v4F MOS46 0810 E9A1 SETV ;set variable MOS46 0772 E97F v4F MOS46 0811 E9A1 ; A = FX code MOS46 0772 E97F v4F MOS46 0812 E9A1 ; X = value MOS46 0772 E97F v4F MOS46 0813 E9A1 ; Y = mask MOS46 0772 E97F v4F MOS46 0814 E9A1 A8 TAY ;Y := FX code MOS46 0772 E97F v4F MOS46 0815 E9A2 B9 90 01 LDAAY VBASE ;A := old value MOS46 0772 E97F v4F MOS46 0816 E9A5 AA TAX ;X := old value MOS46 0772 E97F v4F MOS46 0817 E9A6 25 F1 AND BYTEY ;apply mask MOS46 0772 E97F v4F MOS46 0818 E9A8 45 F0 EOR BYTEX ;apply value MOS46 0772 E97F v4F MOS46 0819 E9AA 99 90 01 STAAY VBASE ;store new value MOS46 0772 E97F v4F MOS46 0820 E9AD B9 91 01 LDAAY VBASE+&01 MOS46 0772 E97F v4F MOS46 0821 E9B0 A8 TAY ;return following byte MOS46 0772 E97F v4F MOS46 0822 E9B1 SPR0 MOS46 0772 E97F v4F MOS46 0823 E9B1 60 RTS -- MOS46 0824 E9B2 -- MOS46 0825 E9B2 -- MOS46 0826 E9B2 BAUDS ;baud rate table (N.B. RS423 bit set cos of B9600 definition) -- MOS46 0827 E9B2 BUFTYP ;**** WARNING - SUBTLE WAY TO DETECT SOUND BUFFERS **** -- MOS46 0828 E9B2 ; (*) = sound buffer -- MOS46 0829 E9B2 0080 SOUNDB * &80 -- MOS46 0830 E9B2 64 = B9600 ;default baud rate / buffer 0 -- MOS46 0831 E9B3 7F = &7F ;75 111 111 / buffer 1 -- MOS46 0832 E9B4 5B = &5B ;150 011 011 / buffer 2 -- MOS46 0833 E9B5 6D = &6D ;300 101 101 / buffer 3 -- MOS46 0834 E9B6 C9 = &49+SOUNDB ;1200 001 001 / buffer 4 (*) -- MOS46 0835 E9B7 F6 = &76+SOUNDB ;2400 110 110 / buffer 5 (*) -- MOS46 0836 E9B8 D2 = &52+SOUNDB ;4800 010 010 / buffer 6 (*) -- MOS46 0837 E9B9 E4 = B9600+SOUNDB ;9600 100 100 / buffer 7 (*) -- MOS46 0838 E9BA 40 = &40 ;19200 000 000 / buffer 8 -- MOS46 0839 E9BB -- MOS46 0840 E9BB -- MOS46 0841 E9BB WFVS ;wait for vertical sync -- MOS46 0842 E9BB AD 40 02 LDA CYCLE -- MOS46 0843 E9BE WFVS1 ;wait for CYCLE to alter -- MOS46 0844 E9BE 58 CLI ;must enable interrupts to allow CYCLE to operate MOS46 0849 E9C3 ^79 MOS46 0845 E9BF ; this should give the user control immediately after VSYNC MOS46 0849 E9C3 ^79 MOS46 0846 E9BF ; interrupt occurred MOS46 0849 E9C3 ^79 MOS46 0847 E9BF 78 SEI MOS46 0849 E9C3 ^79 MOS46 0848 E9C0 CD 40 02 CMP CYCLE MOS46 0849 E9C3 ^79 MOS46 0849 E9C3 F0 F9 BEQ WFVS1 ;[CYCLE not altered] -- MOS46 0850 E9C5 ; -- MOS46 0851 E9C5 ; share exit with read VDU variable -- MOS46 0852 E9C5 ; -- MOS46 0853 E9C5 VDUVAR ;read VDU variables -- MOS46 0854 E9C5 BC 01 03 LDYAX VARBLE+&01 -- MOS46 0855 E9C8 BD 00 03 LDAAX VARBLE+&00 -- MOS46 0856 E9CB AA TAX -- MOS46 0857 E9CC 60 RTS -- MOS46 0858 E9CD -- MOS46 0859 E9CD -- MOS46 0860 E9CD RSOFT ;reset soft keys -- MOS46 0861 E9CD ; initialise soft key pointers -- MOS46 0862 E9CD ; exits with X=0 (used by RESET) -- MOS46 0863 E9CD ; ********** MUST NOT CORRUPT Y (SEE RESET) ********** -- MOS46 0864 E9CD A9 10 LDAIM NSOFTK -- MOS46 0865 E9CF 8D 84 02 STA USKFLG ;signal soft keys inconsistent -- MOS46 0866 E9D2 A2 00 LDXIM ZERO -- MOS46 0867 E9D4 STTA ;set soft key buffer pointers, including the two end pointers -- MOS46 0868 E9D4 9D 00 0B STAAX SKPTR MOS46 0870 E9D8 ^7A MOS46 0869 E9D7 E8 INX MOS46 0870 E9D8 ^7A MOS46 0870 E9D8 D0 FA BNE STTA -- MOS46 0871 E9DA ; X=0 -- MOS46 0872 E9DA 8E 84 02 STX USKFLG ;USKFLG set to zero when soft keys consistent -- MOS46 0873 E9DD ; X=0 -- MOS46 0874 E9DD 60 RTS -- MOS46 0875 E9DE -- MOS46 0876 E9DE -- MOS46 0877 E9DE LNK MOS48 -- MOS48 0001 E9DE -- MOS48 0002 E9DE ; MOS48 -- MOS48 0003 E9DE TTL MOS48 Miscellaneous routines MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 102 MOS48 MOS48 Miscellaneous routines MOS48 -- MOS48 0004 E9DE OPT MOS48 MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 103 MOS48 MOS48 Miscellaneous routines MOS48 -- MOS48 0005 E9DE ;(c) 1981 ACORN Computers Limited -- MOS48 0006 E9DE ;BBC Microcomputer Machine Operating System (MOS) -- MOS48 0007 E9DE -- MOS48 0008 E9DE ;Change record: -- MOS48 0009 E9DE ;01/03/82 PB GSINTC CR indication -- MOS48 0010 E9DE ;05/01/82 PB Change from printer claim to RS423 -- MOS48 0011 E9DE -- MOS48 0012 E9DE ;Author(s): -- MOS48 0013 E9DE ;PB Paul Bond -- MOS48 0014 E9DE -- MOS48 0015 E9DE -- MOS48 0016 E9DE TTL MOS48 External interface routines -- MOS48 0017 E9DE OPT OPNEWP MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 104 MOS48 MOS48 External interface routines MOS48 -- MOS48 0018 E9DE -- MOS48 0019 E9DE -- MOS48 0020 E9DE ; external interfaces -- MOS48 0021 E9DE -- MOS48 0022 E9DE -- MOS48 0023 E9DE MOSTST -- MOS48 0024 E9DE ; C=0 => do not set LEDs, C=1 => set LEDs -- MOS48 0025 E9DE ; N.B. must not corrupt X (see WRCH print section) -- MOS48 0026 E9DE 08 PHP ;push interrupt state -- MOS48 0027 E9DF 78 SEI -- MOS48 0028 E9E0 ; test for ESCAPE -- MOS48 0029 E9E0 A9 40 LDAIM &40 -- MOS48 0030 E9E2 20 EF E9 JSR LEDSON ;conditionally set LEDs and test escape condition -- MOS48 0031 E9E5 30 05 BMI SHIFTX ;[escape pending, simulate SHIFT without CTRL] MOS48 0031 E9E5 v7A MOS48 0032 E9E7 ; MOS48 0031 E9E5 v7A MOS48 0033 E9E7 18 CLC ;indicate test ctrl/shift entry point MOS48 0031 E9E5 v7A MOS48 0034 E9E8 B8 CLV MOS48 0031 E9E5 v7A MOS48 0035 E9E9 20 77 F0 JSR JMIKEY MOS48 0031 E9E5 v7A MOS48 0036 E9EC ; MOS48 0031 E9E5 v7A MOS48 0037 E9EC SHIFTX ;b7(A) => CTRL, b6(A) => SHIFT MOS48 0031 E9E5 v7A MOS48 0038 E9EC 28 PLP -- MOS48 0039 E9ED 2A ROLA ;C => CTRL, MI => SHIFT -- MOS48 0040 E9EE 60 RTS -- MOS48 0041 E9EF -- MOS48 0042 E9EF -- MOS48 0043 E9EF LEDSON ;turn LEDs on -- MOS48 0044 E9EF ; **************************************** -- MOS48 0045 E9EF ; MUST BE ENTERED WITH INTERRUPTS DISABLED -- MOS48 0046 E9EF ; **************************************** -- MOS48 0047 E9EF ; C=0 => do not turn LEDs on, C=1 => turn LEDs on -- MOS48 0048 E9EF ; returns status of BIT ESCFLG -- MOS48 0049 E9EF 90 09 BCC LEDS0 ;[do not turn LEDs on] MOS48 0049 E9EF v76 MOS48 0050 E9F1 ; set both LEDs (indicating a wait state) MOS48 0049 E9EF v76 MOS48 0051 E9F1 A0 07 LDYIM &07 MOS48 0049 E9EF v76 MOS48 0052 E9F3 8C 40 FE STY PBQ ;PBQ:=$07 MOS48 0049 E9EF v76 MOS48 0053 E9F6 88 DEY MOS48 0049 E9EF v76 MOS48 0054 E9F7 8C 40 FE STY PBQ ;PBQ:=$06 MOS48 0049 E9EF v76 MOS48 0055 E9FA LEDS0 ;set escape status MOS48 0049 E9EF v76 MOS48 0056 E9FA 24 FF BIT ESCFLG -- MOS48 0057 E9FC 60 RTS -- MOS48 0058 E9FD -- MOS48 0059 E9FD CREG ;called by VDU module -- MOS48 0060 E9FD ; interrupts are disabled in order that a spurious -- MOS48 0061 E9FD ; ADC interrupt does not occur -- MOS48 0062 E9FD 08 PHP ;save interrupt state -- MOS48 0063 E9FE 78 SEI -- MOS48 0064 E9FF 8D 40 FE STA PBQ ;set addressable latch value -- MOS48 0065 EA02 28 PLP ;restore interrupt state -- MOS48 0066 EA03 60 RTS -- MOS48 0067 EA04 -- MOS48 0068 EA04 -- MOS48 0069 EA04 VP0 ;program vidproc register 0 (FX entry) -- MOS48 0070 EA04 8A TXA -- MOS48 0071 EA05 MVPRC0 ;set video processor register 0 -- MOS48 0072 EA05 08 PHP -- MOS48 0073 EA06 78 SEI ;**** DISABLE INTERRUPTS **** -- MOS48 0074 EA07 8D 48 02 STA VPREGA ;update RAM image -- MOS48 0075 EA0A 8D 20 FE STA VPROC0 ;update ULA -- MOS48 0076 EA0D AD 53 02 LDA FLMRK -- MOS48 0077 EA10 8D 51 02 STA FLCNT ;reset flash count to mark value -- MOS48 0078 EA13 28 PLP -- MOS48 0079 EA14 60 RTS -- MOS48 0080 EA15 -- MOS48 0081 EA15 VP1 ;program vidproc register 1 (FX entry) -- MOS48 0082 EA15 8A TXA -- MOS48 0083 EA16 MVPRC1 ;set video processor register 1 -- MOS48 0084 EA16 49 07 EORIM &07 ;adjust value accounting for ULA bug -- MOS48 0085 EA18 08 PHP -- MOS48 0086 EA19 78 SEI ;**** DISABLE INTERRUPTS **** -- MOS48 0087 EA1A 8D 49 02 STA VPREGB ;update RAM image -- MOS48 0088 EA1D 8D 21 FE STA VPROC1 ;update ULA -- MOS48 0089 EA20 28 PLP -- MOS48 0090 EA21 60 RTS -- MOS48 0091 EA22 -- MOS48 0092 EA22 [ MOS125 = &FF -- MOS48 0093 EA22 | -- MOS48 0094 EA22 ; fetch/store byte from MMIO without dummy read cycle -- MOS48 0095 EA22 ; on entry A=OSBYTE call no. X=addr lo Y=byte C=1 -- MOS48 0096 EA22 69 65 CHEQUE ADCIM &65 ;C=1; A=&FC..FE -- MOS48 0097 EA24 38 SEC -- MOS48 0098 EA25 6A RORA ;C=0 read memory C=1 write -- MOS48 0099 EA26 ; fetch/store byte from I/O mem without dummy read -- MOS48 0100 EA26 ; on entry A=addr hi X=addr lo Y=byte C=0 read C=1 write -- MOS48 0101 EA26 BOUNCE -- MOS48 0102 EA26 85 FB STA PEEKHI ;MSB address -- MOS48 0103 EA28 86 FA STX PEEKLO ;LSB address -- MOS48 0104 EA2A A2 00 LDXIM &00 -- MOS48 0105 EA2C 90 04 BCC BREAD MOS48 0105 EA2C v7B MOS48 0106 EA2E 98 TYA MOS48 0105 EA2C v7B MOS48 0107 EA2F 81 FA STAIX PEEKLO MOS48 0105 EA2C v7B MOS48 0108 EA31 60 RTS MOS48 0105 EA2C v7B MOS48 0109 EA32 BREAD MOS48 0105 EA2C v7B MOS48 0110 EA32 A1 FA LDAIX PEEKLO -- MOS48 0111 EA34 A8 TAY -- MOS48 0112 EA35 38 SEC ;return C=1 from OSBYTE/OSWORD -- MOS48 0113 EA36 60 RTS -- MOS48 0114 EA37 -- MOS48 0115 EA37 MSGON ;used by CFS -- MOS48 0116 EA37 ;Return EQ if messages off and not doing catalogue -- MOS48 0117 EA37 ;or during EXEC/SPOOL (during which messages cannot occur -- MOS48 0118 EA37 ;since this implies writing chars while within RDCH or WRCH) -- MOS48 0119 EA37 -- MOS48 0120 EA37 A5 EB LDA ESSEMA -- MOS48 0121 EA39 30 22 BMI MSGONY ;Inside RDCH/WRCH -> msgs OFF MOS48 0121 EA39 v5D MOS48 0122 EA3B MOS48 0121 EA39 v5D MOS48 0123 EA3B A9 08 LDAIM CATBIT MOS48 0121 EA39 v5D MOS48 0124 EA3D 25 E2 AND CFSTAT MOS48 0121 EA39 v5D MOS48 0125 EA3F D0 04 BNE MSGONX ;Out with msgs set. MOS48 0121 EA39 v5D MOS48 0126 EA41 MOS48 0121 EA39 v5D MOS48 0127 EA41 A9 88 LDAIM MONBIT MOS48 0121 EA39 v5D MOS48 0128 EA43 25 BB AND USFLGS MOS48 0121 EA39 v5D MOS48 0129 EA45 60 MSGONX RTS MOS48 0121 EA39 v5D MOS48 0130 EA46 MOS48 0121 EA39 v5D MOS48 0131 EA46 PEEK ;read byte from I/O processor MOS48 0121 EA39 v5D MOS48 0132 EA46 18 CLC MOS48 0121 EA39 v5D MOS48 0133 EA47 POKE ;write byte to I/O processor MOS48 0121 EA39 v5D MOS48 0134 EA47 AA TAX ;hold address lo-byte MOS48 0121 EA39 v5D MOS48 0135 EA48 C8 INY ;Y=1 MOS48 0121 EA39 v5D MOS48 0136 EA49 B1 F0 LDAIY WORDX ;get address hi-byte MOS48 0121 EA39 v5D MOS48 0137 EA4B 48 PHA ;address in X and 1,S MOS48 0121 EA39 v5D MOS48 0138 EA4C A0 04 LDYIM &04 ;point to byte to write MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 105 MOS48 MOS48 External interface routines MOS48 MOS48 0121 EA39 v5D MOS48 0139 EA4E B1 F0 LDAIY WORDX MOS48 0121 EA39 v5D MOS48 0140 EA50 A8 TAY ;hold byte to write MOS48 0121 EA39 v5D MOS48 0141 EA51 68 PLA ;restore MSB of address MOS48 0121 EA39 v5D MOS48 0142 EA52 20 26 EA JSR BOUNCE ;write byte in Y/read byte into A MOS48 0121 EA39 v5D MOS48 0143 EA55 A0 04 LDYIM &04 MOS48 0121 EA39 v5D MOS48 0144 EA57 91 F0 STAIY WORDX ;store byte read in OSWORD block MOS48 0121 EA39 v5D MOS48 0145 EA59 VER MOS48 0121 EA39 v5D MOS48 0146 EA59 F0 07 BEQ PVER MOS48 0121 EA39 v5D MOS48 0147 EA5B A2 01 LDXIM MCVER ;X=1 for OSBYTE 0,1 MOS version 1 MOS48 0121 EA39 v5D MOS48 0148 EA5D MSGONY ;used by MSGON below MOS48 0121 EA39 v5D MOS48 0149 EA5D A9 00 LDAIM ZERO MOS48 0146 EA59 v78 MOS48 0150 EA5F 60 RTS MOS48 0146 EA59 v78 MOS48 0151 EA60 MOS48 0146 EA59 v78 MOS48 0152 EA60 6C FA 00 JMI JMI JMILO ;jump to specific OSBYTE routine, C=1 -- MOS48 0153 EA63 EA62 PVER * JMI + &02 ;JMILO in zp, use high byte as BRK -- MOS48 0154 EA63 F7 = FX0MSG -- MOS48 0155 EA64 4F 53 20 = "OS " -- MOS48 0156 EA67 31 = VERA -- MOS48 0157 EA68 2E = "." -- MOS48 0158 EA69 32 = VERB -- MOS48 0159 EA6A 36 = VERC ;BRK forms terminator -- MOS48 0160 EA6B -- MOS48 0161 EA6B BADSTR -- MOS48 0162 EA6B 00 BRK ;report error 'Bad string' MOS48 0252 EAD2 ^17 MOS48 0163 EA6C FD = BADST MOS48 0252 EAD2 ^17 MOS48 0164 EA6D 42 61 64 = "Bad string" MOS48 0252 EAD2 ^17 MOS48 0165 EA77 00 = ZERO ;end of message MOS48 0252 EAD2 ^17 MOS48 0166 EA78 ] MOS48 0252 EAD2 ^17 MOS48 0167 EA78 MOS48 0252 EAD2 ^17 MOS48 0168 EA78 GSINTC ;intialise for string access (read item) MOS48 0252 EAD2 ^17 MOS48 0169 EA78 MOS48 0252 EAD2 ^17 MOS48 0170 EA78 18 CLC MOS48 0252 EAD2 ^17 MOS48 0171 EA79 GSINTS ;initialise for string access (read item/rest of line) MOS48 0252 EAD2 ^17 MOS48 0172 EA79 66 E4 ROR KQUOTE MOS48 0252 EAD2 ^17 MOS48 0173 EA7B 20 93 E0 JSR SKIPSP ;A := LDAIY WORK MOS48 0252 EAD2 ^17 MOS48 0174 EA7E C8 INY ;skip possible opening quote MOS48 0252 EAD2 ^17 MOS48 0175 EA7F C9 22 CMPIM DQUOTE MOS48 0252 EAD2 ^17 MOS48 0176 EA81 F0 02 BEQ CLIOQ ;[opening quote, C=1] MOS48 0252 EAD2 ^17 MOS48 0177 EA83 ; no opening quote MOS48 0252 EAD2 ^17 MOS48 0178 EA83 88 DEY ;adjust for erroneous skip MOS48 0252 EAD2 ^17 MOS48 0179 EA84 18 CLC MOS48 0252 EAD2 ^17 MOS48 0180 EA85 CLIOQ MOS48 0252 EAD2 ^17 MOS48 0181 EA85 66 E4 ROR KQUOTE ;PL => not a quoted string, MI => a quoted string MOS48 0252 EAD2 ^17 MOS48 0182 EA87 C9 0D CMPIM MCR ;return EQ => end-of-string, NEQ => not end-of-string MOS48 0252 EAD2 ^17 MOS48 0183 EA89 60 RTS MOS48 0252 EAD2 ^17 MOS48 0184 EA8A ; MOS48 0252 EAD2 ^17 MOS48 0185 EA8A GSREAD ;read character from string MOS48 0252 EAD2 ^17 MOS48 0186 EA8A MOS48 0252 EAD2 ^17 MOS48 0187 EA8A ; reset key mask (used in top bit option) MOS48 0252 EAD2 ^17 MOS48 0188 EA8A A9 00 LDAIM ZERO MOS48 0252 EAD2 ^17 MOS48 0189 EA8C GSRA ;used by |! option, entered with A=$80 MOS48 0252 EAD2 ^17 MOS48 0190 EA8C 85 E5 STA KMASK ;KMASK := 0000 0000 (or KMASK := 1000 0000) MOS48 0252 EAD2 ^17 MOS48 0191 EA8E B1 F2 LDAIY WORK ;A := next character MOS48 0252 EAD2 ^17 MOS48 0192 EA90 C9 0D CMPIM MCR MOS48 0252 EAD2 ^17 MOS48 0193 EA92 D0 06 BNE KEYNCR ;[not CR] MOS48 0252 EAD2 ^17 MOS48 0194 EA94 ; CR found, C=1 MOS48 0252 EAD2 ^17 MOS48 0195 EA94 ; check that string did not open with double quote MOS48 0252 EAD2 ^17 MOS48 0196 EA94 24 E4 BIT KQUOTE MOS48 0252 EAD2 ^17 MOS48 0197 EA96 30 D3 BMI BADSTR ;[opening double quote without closing double quote] MOS48 0252 EAD2 ^17 MOS48 0198 EA98 10 19 BPL GSR1 ;[ALWAYS jump, return C=1 and EQ=>CR] MOS48 0252 EAD2 ^17 MOS48 0199 EA9A KEYNCR ;character not CR MOS48 0252 EAD2 ^17 MOS48 0200 EA9A C9 20 CMPIM SPACE MOS48 0252 EAD2 ^17 MOS48 0201 EA9C 90 CD BCC BADSTR ;[control character in string] MOS48 0252 EAD2 ^17 MOS48 0202 EA9E D0 06 BNE KEYNSP ;[not space] MOS48 0252 EAD2 ^17 MOS48 0203 EAA0 ; space character MOS48 0252 EAD2 ^17 MOS48 0204 EAA0 24 E4 BIT KQUOTE MOS48 0252 EAD2 ^17 MOS48 0205 EAA2 30 3E BMI GSR0 ;[in quoted string] MOS48 0252 EAD2 ^17 MOS48 0206 EAA4 50 0D BVC GSR1 ;[not in quoted string and not read line, so space is terminator] MOS48 0252 EAD2 ^17 MOS48 0207 EAA6 ; fall thru, space will be returned as a valid character MOS48 0252 EAD2 ^17 MOS48 0208 EAA6 KEYNSP MOS48 0252 EAD2 ^17 MOS48 0209 EAA6 C9 22 CMPIM DQUOTE MOS48 0252 EAD2 ^17 MOS48 0210 EAA8 D0 0E BNE KEYNDQ ;[not double quote] MOS48 0252 EAD2 ^17 MOS48 0211 EAAA ; double quote found MOS48 0252 EAD2 ^17 MOS48 0212 EAAA 24 E4 BIT KQUOTE MOS48 0252 EAD2 ^17 MOS48 0213 EAAC 10 34 BPL GSR0 ;[not in quoted string] MOS48 0252 EAD2 ^17 MOS48 0214 EAAE ; in quoted string MOS48 0252 EAD2 ^17 MOS48 0215 EAAE C8 INY MOS48 0252 EAD2 ^17 MOS48 0216 EAAF [ MOS125 = &FF MOS48 0252 EAD2 ^17 MOS48 0219 EAAF | MOS48 0252 EAD2 ^17 MOS48 0220 EAAF D1 F2 CMPIY WORK ;A = DQUOTE, compare with next character MOS48 0252 EAD2 ^17 MOS48 0221 EAB1 ] MOS48 0252 EAD2 ^17 MOS48 0222 EAB1 F0 2F BEQ GSR0 ;["" found in quoted string] MOS48 0252 EAD2 ^17 MOS48 0223 EAB3 GSR1 ;closing quote of quoted string MOS48 0252 EAD2 ^17 MOS48 0224 EAB3 20 93 E0 JSR SKIPSP ;skip spaces MOS48 0252 EAD2 ^17 MOS48 0225 EAB6 38 SEC MOS48 0252 EAD2 ^17 MOS48 0226 EAB7 60 RTS MOS48 0252 EAD2 ^17 MOS48 0227 EAB8 MOS48 0252 EAD2 ^17 MOS48 0228 EAB8 KEYNDQ ;character not CR or " MOS48 0252 EAD2 ^17 MOS48 0229 EAB8 C9 7C CMPIM "|" ;check for pseudo-escape MOS48 0252 EAD2 ^17 MOS48 0230 EABA D0 26 BNE GSR0 ;[valid string character] MOS48 0252 EAD2 ^17 MOS48 0231 EABC ; MOS48 0252 EAD2 ^17 MOS48 0232 EABC C8 INY MOS48 0252 EAD2 ^17 MOS48 0233 EABD B1 F2 LDAIY WORK MOS48 0252 EAD2 ^17 MOS48 0234 EABF C9 7C CMPIM "|" MOS48 0252 EAD2 ^17 MOS48 0235 EAC1 F0 1F BEQ GSR0 ;[|| found] MOS48 0252 EAD2 ^17 MOS48 0236 EAC3 ; MOS48 0252 EAD2 ^17 MOS48 0237 EAC3 C9 22 CMPIM DQUOTE MOS48 0252 EAD2 ^17 MOS48 0238 EAC5 F0 1B BEQ GSR0 ;[|" found] MOS48 0252 EAD2 ^17 MOS48 0239 EAC7 ; MOS48 0252 EAD2 ^17 MOS48 0240 EAC7 C9 21 CMPIM "!" MOS48 0252 EAD2 ^17 MOS48 0241 EAC9 D0 05 BNE KEYNPL ;[not |!] MOS48 0252 EAD2 ^17 MOS48 0242 EACB ; C=1 MOS48 0252 EAD2 ^17 MOS48 0243 EACB ; |! found - top bit option MOS48 0252 EAD2 ^17 MOS48 0244 EACB C8 INY ;step to next character MOS48 0252 EAD2 ^17 MOS48 0245 EACC ; C=1 MOS48 0252 EAD2 ^17 MOS48 0246 EACC A9 80 LDAIM &80 ;KMASK := 1000 0000 MOS48 0252 EAD2 ^17 MOS48 0247 EACE D0 BC BNE GSRA ;[ALWAYS jump, get next character reseting key mask] MOS48 0252 EAD2 ^17 MOS48 0248 EAD0 ; NEVER fall thru MOS48 0252 EAD2 ^17 MOS48 0249 EAD0 MOS48 0252 EAD2 ^17 MOS48 0250 EAD0 KEYNPL ;check for control character MOS48 0252 EAD2 ^17 MOS48 0251 EAD0 C9 20 CMPIM SPACE MOS48 0252 EAD2 ^17 MOS48 0252 EAD2 90 97 BCC BADSTR ;[string contains a control character] MOS48 0205 EAA2 v41 MOS48 0253 EAD4 ; convert to CTRL character MOS48 0205 EAA2 v41 MOS48 0254 EAD4 C9 3F CMPIM "?" MOS48 0205 EAA2 v41 MOS48 0255 EAD6 F0 08 BEQ KEYDEL MOS48 0205 EAA2 v41 MOS48 0256 EAD8 20 0B EB JSR CTRLCH MOS48 0205 EAA2 v41 MOS48 0257 EADB ; fall thru with adjusted character MOS48 0205 EAA2 v41 MOS48 0258 EADB 2C 49 D9 BIT FFBYT ;indicate character was escaped MOS48 0205 EAA2 v41 MOS48 0259 EADE 70 03 BVS GSRX ;[ALWAYS jump] MOS48 0205 EAA2 v41 MOS48 0260 EAE0 ; MOS48 0205 EAA2 v41 MOS48 0261 EAE0 KEYDEL ;|? MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 106 MOS48 MOS48 External interface routines MOS48 MOS48 0205 EAA2 v41 MOS48 0262 EAE0 A9 7F LDAIM MDEL MOS48 0205 EAA2 v41 MOS48 0263 EAE2 ; MOS48 0205 EAA2 v41 MOS48 0264 EAE2 GSR0 ;valid character MOS48 0205 EAA2 v41 MOS48 0265 EAE2 B8 CLV MOS48 0259 EADE v7C MOS48 0266 EAE3 ; MOS48 0259 EADE v7C MOS48 0267 EAE3 GSRX ;exit with valid character MOS48 0259 EADE v7C MOS48 0268 EAE3 ; rotate in selected top bit MOS48 0259 EADE v7C MOS48 0269 EAE3 C8 INY ;skip to next character -- MOS48 0270 EAE4 05 E5 ORA KMASK ;test character for filing system applications -- MOS48 0271 EAE6 18 CLC -- MOS48 0272 EAE7 ; C=0, V=0 => not escaped, V=1 => escaped -- MOS48 0273 EAE7 60 RTS -- MOS48 0274 EAE8 -- MOS48 0275 EAE8 -- MOS48 0276 EAE8 [ MOS125 = &FF -- MOS48 0282 EAE8 ] -- MOS48 0283 EAE8 -- MOS48 0284 EAE8 SHIFT ;perform shift inversion -- MOS48 0285 EAE8 ; -- MOS48 0286 EAE8 ; check for '0' character explicitly -- MOS48 0287 EAE8 ; -- MOS48 0288 EAE8 C9 30 CMPIM "0" -- MOS48 0289 EAEA F0 1E BEQ SHIFT0 ;[character is '0', shift '0' is '0', no action] MOS48 0289 EAEA v61 MOS48 0290 EAEC MOS48 0289 EAEA v61 MOS48 0291 EAEC ; convert characters in range ['A',DEL) MOS48 0289 EAEA v61 MOS48 0292 EAEC ; MOS48 0289 EAEA v61 MOS48 0293 EAEC C9 40 CMPIM AT MOS48 0289 EAEA v61 MOS48 0294 EAEE F0 1A BEQ SHIFT0 ;[AT, no action] MOS48 0289 EAEA v61 MOS48 0295 EAF0 90 12 BCC SHIFT1 ;[ch= 'A' MOS48 0289 EAEA v61 MOS48 0298 EAF2 ; MOS48 0289 EAEA v61 MOS48 0299 EAF2 C9 7F CMPIM MDEL MOS48 0289 EAEA v61 MOS48 0300 EAF4 F0 14 BEQ SHIFT0 ;[ch=DEL, no action] MOS48 0289 EAEA v61 MOS48 0301 EAF6 B0 10 BCS SHFLIP ;[ch>DEL, is softkey code] MOS48 0289 EAEA v61 MOS48 0302 EAF8 ; MOS48 0289 EAEA v61 MOS48 0303 EAF8 ; 'A' <= character < DEL MOS48 0289 EAEA v61 MOS48 0304 EAF8 ; MOS48 0289 EAEA v61 MOS48 0305 EAF8 CTRLSK ;used by CTRLCH for CTRL/softkey MOS48 0289 EAEA v61 MOS48 0306 EAF8 49 30 EORIM &30 ;flip bit to effect shift (N.B. EORIM $10 later) MOS48 0289 EAEA v61 MOS48 0307 EAFA ; MOS48 0289 EAEA v61 MOS48 0308 EAFA ; N.B. this has mapped '_' to $6F and POUND to $50 MOS48 0289 EAEA v61 MOS48 0309 EAFA ; swop underline and pound characters MOS48 0289 EAEA v61 MOS48 0310 EAFA ; MOS48 0289 EAEA v61 MOS48 0311 EAFA C9 6F CMPIM &6F ;i.e. mapped '_' MOS48 0289 EAEA v61 MOS48 0312 EAFC F0 04 BEQ SHIFT2 ;[underline character] MOS48 0289 EAEA v61 MOS48 0313 EAFE C9 50 CMPIM &50 ;i.e. mapped POUND (not altered by EORIM $20 anyway) MOS48 0289 EAEA v61 MOS48 0314 EB00 D0 02 BNE SHIFT1 ;[neither underline nor pound character] MOS48 0289 EAEA v61 MOS48 0315 EB02 ; MOS48 0289 EAEA v61 MOS48 0316 EB02 SHIFT2 ;swop underline and pound characters MOS48 0289 EAEA v61 MOS48 0317 EB02 49 1F EORIM &1F MOS48 0289 EAEA v61 MOS48 0318 EB04 ; MOS48 0289 EAEA v61 MOS48 0319 EB04 SHIFT1 MOS48 0289 EAEA v61 MOS48 0320 EB04 MOS48 0289 EAEA v61 MOS48 0321 EB04 ; convert characters above '!' MOS48 0289 EAEA v61 MOS48 0322 EB04 ; MOS48 0289 EAEA v61 MOS48 0323 EB04 C9 21 CMPIM "!" MOS48 0289 EAEA v61 MOS48 0324 EB06 90 02 BCC SHIFT0 ;[ch<'!', no action] MOS48 0289 EAEA v61 MOS48 0325 EB08 ; MOS48 0289 EAEA v61 MOS48 0326 EB08 ; '!' <= ch < AT MOS48 0289 EAEA v61 MOS48 0327 EB08 ; MOS48 0289 EAEA v61 MOS48 0328 EB08 SHFLIP MOS48 0289 EAEA v61 MOS48 0329 EB08 49 10 EORIM &10 ;$80..$8F -> $90..$9F and vice-versa MOS48 0289 EAEA v61 MOS48 0330 EB0A MOS48 0289 EAEA v61 MOS48 0331 EB0A SHIFT0 MOS48 0289 EAEA v61 MOS48 0332 EB0A 60 RTS MOS48 0338 EB0F ^67 MOS48 0333 EB0B MOS48 0338 EB0F ^67 MOS48 0334 EB0B MOS48 0338 EB0F ^67 MOS48 0335 EB0B CTRLCH ;compute CTRL version of character MOS48 0338 EB0F ^67 MOS48 0336 EB0B C9 7F CMPIM MDEL MOS48 0338 EB0F ^67 MOS48 0337 EB0D F0 0E BEQ CTRL0 ;[CTRL/DEL = DEL] MOS48 0338 EB0F ^67 MOS48 0338 EB0F B0 E7 BCS CTRLSK ;[top bit set, therefore softkey needing EORIM $20] MOS48 0337 EB0D v71 MOS48 0339 EB11 MOS48 0337 EB0D v71 MOS48 0340 EB11 ; pound & underline MOS48 0337 EB0D v71 MOS48 0341 EB11 ; MOS48 0337 EB0D v71 MOS48 0342 EB11 C9 60 CMPIM POUND ;make CTRL/pound = CTRL/underline MOS48 0337 EB0D v71 MOS48 0343 EB13 D0 02 BNE CTRL1 ;[not pound character] MOS48 0337 EB0D v71 MOS48 0344 EB15 A9 5F LDAIM "_" ;substitute underline for pound MOS48 0337 EB0D v71 MOS48 0345 EB17 CTRL1 MOS48 0337 EB0D v71 MOS48 0346 EB17 MOS48 0337 EB0D v71 MOS48 0347 EB17 [ FALSE=0 MOS48 0337 EB0D v71 MOS48 0353 EB17 ] MOS48 0337 EB0D v71 MOS48 0354 EB17 MOS48 0337 EB0D v71 MOS48 0355 EB17 [ FALSE=0 MOS48 0337 EB0D v71 MOS48 0361 EB17 ] MOS48 0337 EB0D v71 MOS48 0362 EB17 MOS48 0337 EB0D v71 MOS48 0363 EB17 C9 40 CMPIM AT MOS48 0337 EB0D v71 MOS48 0364 EB19 90 02 BCC CTRL4 ;[character < AT so do not convert] MOS48 0337 EB0D v71 MOS48 0365 EB1B ; AT <= character < DEL, so convert MOS48 0337 EB0D v71 MOS48 0366 EB1B 29 1F ANDIM &1F ;convert to ctrl value MOS48 0337 EB0D v71 MOS48 0367 EB1D CTRL4 MOS48 0337 EB0D v71 MOS48 0368 EB1D MOS48 0337 EB0D v71 MOS48 0369 EB1D CTRL0 MOS48 0337 EB0D v71 MOS48 0370 EB1D 60 RTS -- MOS48 0371 EB1E -- MOS48 0372 EB1E [ FALSE=0 -- MOS48 0375 EB1E ] -- MOS48 0376 EB1E -- MOS48 0377 EB1E SLBOOT ;'/!BOOT' auto-boot string -- MOS48 0378 EB1E 2F 21 42 = "/!BOOT" -- MOS48 0379 EB24 0D = MCR -- MOS48 0380 EB25 -- MOS48 0381 EB25 -- MOS48 0382 EB25 BREAK ;conditionally intercept BREAK -- MOS48 0383 EB25 ; type of interception is in C -- MOS48 0384 EB25 AD 87 02 LDA BREAKI -- MOS48 0385 EB28 49 4C EORIM &4C -- MOS48 0386 EB2A D0 13 BNE BREAK0 ;[not a JMP instruction] MOS48 0386 EB2A v6C MOS48 0387 EB2C 4C 87 02 JMP BREAKI MOS48 0386 EB2A v6C MOS48 0388 EB2F MOS48 0386 EB2A v6C MOS48 0389 EB2F MOS48 0386 EB2A v6C MOS48 0390 EB2F TV ;alter TV characteristics MOS48 0386 EB2A v6C MOS48 0391 EB2F AD 90 02 LDA VERTIC MOS48 0386 EB2A v6C MOS48 0392 EB32 8E 90 02 STX VERTIC ;vertical height adjust MOS48 0386 EB2A v6C MOS48 0393 EB35 AA TAX ;X := old state MOS48 0386 EB2A v6C MOS48 0394 EB36 98 TYA MOS48 0386 EB2A v6C MOS48 0395 EB37 29 01 ANDIM &01 MOS48 0386 EB2A v6C MOS48 0396 EB39 AC 91 02 LDY INTERL ;Y := old state MOS48 0386 EB2A v6C MOS48 0397 EB3C 8D 91 02 STA INTERL ;interlace invert MOS48 0386 EB2A v6C MOS48 0398 EB3F BREAK0 MOS48 0386 EB2A v6C MOS48 0399 EB3F 60 RTS MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 107 MOS48 MOS48 External interface routines MOS48 -- MOS48 0400 EB40 -- MOS48 0401 EB40 [ MOS125 = &FF -- MOS48 0416 EB40 ] -- MOS48 0417 EB40 -- MOS48 0418 EB40 LNK MOS52 -- MOS52 0001 EB40 -- MOS52 0002 EB40 ; MOS52 -- MOS52 0003 EB40 TTL MOS52 Sound generator -- MOS52 0004 EB40 OPT MOS52 MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 108 MOS52 MOS52 Sound generator MOS52 -- MOS52 0005 EB40 ;(c) 1981 ACORN Computers Limited -- MOS52 0006 EB40 ;BBC Microcomputer Machine Operating System (MOS) -- MOS52 0007 EB40 ;Change record: -- MOS52 0008 EB40 ;Prototype version 14/1/82 -- MOS52 0009 EB40 ;Author(s): -- MOS52 0010 EB40 ;PBM Peter Miller -- MOS52 0011 EB40 ;Internal variable allocation $0800 to $08C0 -- MOS52 0012 EB40 08C0 ENV * ENVEL ;envelope table 16 bytes per envelope -- MOS52 0013 EB40 0804 ATTN * SNDWRK+&04 ;current attenuation -- MOS52 0014 EB40 0808 EPERD * ATTN +&04 ;current envelope period -- MOS52 0015 EB40 080C SNOTE * EPERD +&04 ;base note -- MOS52 0016 EB40 0810 NPERD * SNOTE +&04 ;the current frequency envelope period 0-3 -- MOS52 0017 EB40 0814 NCONT * NPERD +&04 ;number of ticks left in current frequency period -- MOS52 0018 EB40 0818 DUR * NCONT +&04 ;remaining number of ticks in the current note -- MOS52 0019 EB40 081C DRDIV * DUR +&04 ;division of 1/100 sewc to 1/20 sec -- MOS52 0020 EB40 0820 ENVLP * DRDIV +&04 ;current envelope ( TIMES 16) -- MOS52 0021 EB40 0824 SCONT * ENVLP +&04 ;number of 1/100th secs before next envelope tick -- MOS52 0022 EB40 0828 WAIT * SCONT +&04 ;channel waiting for sWATGO flag -- MOS52 0023 EB40 082C OLDNTE * WAIT +&04 ;current note in chip -- MOS52 0024 EB40 0830 NTADD * OLDNTE +&04 ;current offset from base note -- MOS52 0025 EB40 -- MOS52 0026 EB40 -- MOS52 0027 EB40 0838 NOWAT * NTADD +&08 ;number of other channels required for chord -- MOS52 0028 EB40 0839 ATINC * NOWAT +&01 ;current rate of attn change -- MOS52 0029 EB40 083A PEAK * ATINC +&01 ;peak of amplitude envelope -- MOS52 0030 EB40 083B WATGO * PEAK +&01 ;flag <>0 => play chord -- MOS52 0031 EB40 083C FRACT * WATGO +&01 ;fractional part of current note -- MOS52 0032 EB40 083D PRDL * FRACT +&01 ;low period during convert -- MOS52 0033 EB40 083E PRDH * PRDL +&01 ;hign period during convert -- MOS52 0034 EB40 083F NOTDIF * PRDH +&01 ;Note difference used in interpolation -- MOS52 0035 EB40 -- MOS52 0036 EB40 02CF FLUSH * SFLUSH -&04 -- MOS52 0037 EB40 0800 ACTIV * MACTIV -&04 -- MOS52 0038 EB40 -- MOS52 0039 EB40 -- MOS52 0040 EB40 ;Externally referenced data -- MOS52 0041 EB40 ;ACTIV -- MOS52 0042 EB40 ;FLUSH -- MOS52 0043 EB40 ;ENVEL -- MOS52 0044 EB40 ;SNDWRK -- MOS52 0045 EB40 ;Externally referenced routines -- MOS52 0046 EB40 ;EXAM -- MOS52 0047 EB40 ;REMOV -- MOS52 0048 EB40 ;Entry points -- MOS52 0049 EB40 ;SNDRST Initialise sound system, shut sound chip up -- MOS52 0050 EB40 ; Acc,X,Y ,P destroyed -- MOS52 0051 EB40 ;SNDIRQ Service entry point 1/100th second -- MOS52 0052 EB40 ; only use after initialisation -- MOS52 0053 EB40 ; Acc,X ,Y and P destroyed -- MOS52 0054 EB40 ;; A,X,P preserved, Y set to zero on exit -- MOS52 0055 EB40 -- MOS52 0056 EB40 -- MOS52 0057 EB40 MINATN ;set minimum attenuation -- MOS52 0058 EB40 A9 04 LDAIM &04 -- MOS52 0059 EB42 9D 08 08 STAAX EPERD -- MOS52 0060 EB45 A9 C0 LDAIM &C0 -- MOS52 0061 EB47 -- MOS52 0062 EB47 -- MOS52 0063 EB47 UPATN ;update attenuation -- MOS52 0064 EB47 9D 04 08 STAAX ATTN -- MOS52 0065 EB4A ; -- MOS52 0066 EB4A ; shut up mode ? -- MOS52 0067 EB4A ; -- MOS52 0068 EB4A AC 62 02 LDY SHUTUP -- MOS52 0069 EB4D F0 02 BEQ NOISY ;[sound allowed] MOS52 0069 EB4D v7D MOS52 0070 EB4F ; sound suppressed MOS52 0069 EB4D v7D MOS52 0071 EB4F A9 C0 LDAIM &C0 ;force minimum attenuation MOS52 0069 EB4D v7D MOS52 0072 EB51 NOISY MOS52 0069 EB4D v7D MOS52 0073 EB51 ; MOS52 0069 EB4D v7D MOS52 0074 EB51 [ MOS125 = &FF MOS52 0069 EB4D v7D MOS52 0083 EB51 | MOS52 0069 EB4D v7D MOS52 0084 EB51 ; in: x ~b3 b2 b1 b0 x x x MOS52 0069 EB4D v7D MOS52 0085 EB51 ;out: c2 c1 c0 1 ~b3 ~b2 ~b1 ~b0 MOS52 0069 EB4D v7D MOS52 0086 EB51 4A LSRA -- MOS52 0087 EB52 4A LSRA -- MOS52 0088 EB53 4A LSRA -- MOS52 0089 EB54 1D 76 EB ORAAX CHAN -- MOS52 0090 EB57 29 EF ANDIM &EF -- MOS52 0091 EB59 49 17 EORIM &17 -- MOS52 0092 EB5B ] -- MOS52 0093 EB5B ;fall into the send routine -- MOS52 0094 EB5B SNDOUT -- MOS52 0095 EB5B SEND -- MOS52 0096 EB5B 08 PHP -- MOS52 0097 EB5C SENDX ;entered by code which has already done a PHP -- MOS52 0098 EB5C 78 SEI -- MOS52 0099 EB5D A0 FF LDYIM &FF -- MOS52 0100 EB5F 8C 43 FE STY &FE43 -- MOS52 0101 EB62 8D 4F FE STA &FE4F -- MOS52 0102 EB65 C8 INY -- MOS52 0103 EB66 8C 40 FE STY &FE40 -- MOS52 0104 EB69 A0 02 LDYIM &02 -- MOS52 0105 EB6B SWAIT -- MOS52 0106 EB6B 88 DEY MOS52 0107 EB6C ^7D MOS52 0107 EB6C D0 FD BNE SWAIT -- MOS52 0108 EB6E A0 08 LDYIM &08 -- MOS52 0109 EB70 8C 40 FE STY &FE40 -- MOS52 0110 EB73 A0 04 LDYIM &04 -- MOS52 0111 EB75 SWAT2 -- MOS52 0112 EB75 88 DEY MOS52 0113 EB76 ^7D MOS52 0113 EB76 D0 FD BNE SWAT2 -- MOS52 0114 EB78 28 PLP -- MOS52 0115 EB79 60 RTS -- MOS52 0116 EB7A RCHAN -- MOS52 0117 EB7A EB76 CHAN * RCHAN -&04 -- MOS52 0118 EB7A E0 = &E0 -- MOS52 0119 EB7B C0 = &C0 -- MOS52 0120 EB7C A0 = &A0 -- MOS52 0121 EB7D 80 = &80 -- MOS52 0122 EB7E -- MOS52 0123 EB7E -- MOS52 0124 EB7E HENDS -- MOS52 0125 EB7E 4C 7F EC JMP ENDSW ;finished all envelope processing MOS52 0172 EBCF ^2D MOS52 0126 EB81 MOS52 0172 EBCF ^2D MOS52 0127 EB81 SNDIRQ MOS52 0172 EBCF ^2D MOS52 0128 EB81 A9 00 LDAIM ZERO MOS52 0172 EBCF ^2D MOS52 0129 EB83 8D 3B 08 STA WATGO MOS52 0172 EBCF ^2D MOS52 0130 EB86 AD 38 08 LDA NOWAT MOS52 0172 EBCF ^2D MOS52 0131 EB89 D0 06 BNE MAN2 MOS52 0172 EBCF ^2D MOS52 0132 EB8B EE 3B 08 INC WATGO MOS52 0172 EBCF ^2D MOS52 0133 EB8E CE 38 08 DEC NOWAT MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 109 MOS52 MOS52 Sound generator MOS52 MOS52 0172 EBCF ^2D MOS52 0134 EB91 MAN2 MOS52 0172 EBCF ^2D MOS52 0135 EB91 A2 08 LDXIM &08 ;X always contains current channel MOS52 0172 EBCF ^2D MOS52 0136 EB93 MNLOP MOS52 0172 EBCF ^2D MOS52 0137 EB93 CA DEX ;first real channel is 3 MOS52 0172 EBCF ^2D MOS52 0138 EB94 BD 00 08 LDAAX ACTIV ;check if channel X is doing anything MOS52 0172 EBCF ^2D MOS52 0139 EB97 F0 E5 BEQ HENDS ;[channel not active so take quick route] MOS52 0172 EBCF ^2D MOS52 0140 EB99 BD CF 02 LDAAX FLUSH MOS52 0172 EBCF ^2D MOS52 0141 EB9C 30 05 BMI MAN8 ;[must abort current note] MOS52 0172 EBCF ^2D MOS52 0142 EB9E BD 18 08 LDAAX DUR MOS52 0172 EBCF ^2D MOS52 0143 EBA1 D0 03 BNE MAN10 ;[note finished] MOS52 0172 EBCF ^2D MOS52 0144 EBA3 MAN8 MOS52 0172 EBCF ^2D MOS52 0145 EBA3 20 91 EC JSR NXTNT ;[get new note from queue if it exists] MOS52 0172 EBCF ^2D MOS52 0146 EBA6 MAN10 MOS52 0172 EBCF ^2D MOS52 0147 EBA6 BD 18 08 LDAAX DUR MOS52 0172 EBCF ^2D MOS52 0148 EBA9 F0 13 BEQ MAN13 ;next note now MOS52 0172 EBCF ^2D MOS52 0149 EBAB C9 FF CMPIM &FF MOS52 0172 EBCF ^2D MOS52 0150 EBAD F0 12 BEQ MAN12 MOS52 0172 EBCF ^2D MOS52 0151 EBAF DE 1C 08 DECAX DRDIV MOS52 0172 EBCF ^2D MOS52 0152 EBB2 D0 0D BNE MAN12 ;[not 1/20th sec tick] MOS52 0172 EBCF ^2D MOS52 0153 EBB4 A9 05 LDAIM &05 MOS52 0172 EBCF ^2D MOS52 0154 EBB6 9D 1C 08 STAAX DRDIV ; set counter to wait for further 1/20th sec MOS52 0172 EBCF ^2D MOS52 0155 EBB9 DE 18 08 DECAX DUR MOS52 0172 EBCF ^2D MOS52 0156 EBBC D0 03 BNE MAN12 MOS52 0172 EBCF ^2D MOS52 0157 EBBE MAN13 MOS52 0172 EBCF ^2D MOS52 0158 EBBE 20 91 EC JSR NXTNT ;try to get a new note MOS52 0172 EBCF ^2D MOS52 0159 EBC1 MAN12 MOS52 0172 EBCF ^2D MOS52 0160 EBC1 BD 24 08 LDAAX SCONT MOS52 0172 EBCF ^2D MOS52 0161 EBC4 F0 05 BEQ MAN11 MOS52 0172 EBCF ^2D MOS52 0162 EBC6 DE 24 08 DECAX SCONT ;dec envelope scaling counter MOS52 0172 EBCF ^2D MOS52 0163 EBC9 D0 B3 BNE HENDS ;[not time for new envelope tick] MOS52 0172 EBCF ^2D MOS52 0164 EBCB MAN11 MOS52 0172 EBCF ^2D MOS52 0165 EBCB BC 20 08 LDYAX ENVLP ;get envelope offset into Y MOS52 0172 EBCF ^2D MOS52 0166 EBCE [ MOS125 = &FF MOS52 0172 EBCF ^2D MOS52 0170 EBCE | MOS52 0172 EBCF ^2D MOS52 0171 EBCE C8 INY MOS52 0172 EBCF ^2D MOS52 0172 EBCF F0 AD BEQ HENDS -- MOS52 0173 EBD1 B9 BF 08 LDAAY ENV-&01 ;get first envelope parameter -- MOS52 0174 EBD4 ] -- MOS52 0175 EBD4 29 7F ANDIM &7F ;mask off sweep repeat bit -- MOS52 0176 EBD6 9D 24 08 STAAX SCONT ;set up scaling counter again -- MOS52 0177 EBD9 BD 08 08 LDAAX EPERD ;envelope period -- MOS52 0178 EBDC C9 04 CMPIM &04 ;check for 'finished' period -- MOS52 0179 EBDE F0 52 BEQ ENDEV ;[no longer in middle of envelope] MOS52 0179 EBDE v2D MOS52 0180 EBE0 ; MOS52 0179 EBDE v2D MOS52 0181 EBE0 [ MOS125 = &FF MOS52 0179 EBDE v2D MOS52 0183 EBE0 ] MOS52 0179 EBDE v2D MOS52 0184 EBE0 18 CLC MOS52 0179 EBDE v2D MOS52 0185 EBE1 7D 20 08 ADCAX ENVLP ;get offset to current amplitude envelope parameters MOS52 0179 EBDE v2D MOS52 0186 EBE4 A8 TAY ;ENV+7,Y now point to attninc rate and sENV+11 to attnlevel MOS52 0179 EBDE v2D MOS52 0187 EBE5 B9 CB 08 LDAAY ENV+&0B ;atenuation level MOS52 0179 EBDE v2D MOS52 0188 EBE8 38 SEC MOS52 0179 EBDE v2D MOS52 0189 EBE9 E9 3F SBCIM &3F MOS52 0179 EBDE v2D MOS52 0190 EBEB 8D 3A 08 STA PEAK ;temp data for following calculations MOS52 0179 EBDE v2D MOS52 0191 EBEE B9 C7 08 LDAAY ENV+&7 ;amount by which attenuation is changed each tick MOS52 0179 EBDE v2D MOS52 0192 EBF1 8D 39 08 STA ATINC ;temp data for calculations MOS52 0179 EBDE v2D MOS52 0193 EBF4 BD 04 08 LDAAX ATTN MOS52 0179 EBDE v2D MOS52 0194 EBF7 48 PHA MOS52 0179 EBDE v2D MOS52 0195 EBF8 18 CLC MOS52 0179 EBDE v2D MOS52 0196 EBF9 6D 39 08 ADC ATINC ;add incremnet to attenuation MOS52 0179 EBDE v2D MOS52 0197 EBFC 50 04 BVC OK8 ;first check for 8 bit overflow MOS52 0179 EBDE v2D MOS52 0198 EBFE [ MOS125 = &FF MOS52 0179 EBDE v2D MOS52 0216 EBFE | MOS52 0179 EBDE v2D MOS52 0217 EBFE ;else overflow. carry=~b7. generate &C0 if b7=0 or &3F if b7=1 MOS52 0179 EBDE v2D MOS52 0218 EBFE 09 7F ORAIM &7F ;n111 1111 C=~n MOS52 0179 EBDE v2D MOS52 0219 EC00 69 40 ADCIM &40 ;~~nn nnnn C=n MOS52 0179 EBDE v2D MOS52 0220 EC02 OK8 MOS52 0179 EBDE v2D MOS52 0221 EC02 C9 C0 CMPIM &C0 ;compare b7 and b6 (thanks again Woz) MOS52 0179 EBDE v2D MOS52 0222 EC04 10 06 BPL ATOK ;if b7=b6 then value in range MOS52 0179 EBDE v2D MOS52 0223 EC06 ;else overflow. generate &3F if b7=0 or &C0 if b7=1 MOS52 0179 EBDE v2D MOS52 0224 EC06 09 7F ORAIM &7F ;n111 1111 C=0 MOS52 0179 EBDE v2D MOS52 0225 EC08 69 40 ADCIM &40 ;~011 1111 C=n MOS52 0179 EBDE v2D MOS52 0226 EC0A 69 80 ADCIM &80 ;nn~~ ~~~~ C=~n MOS52 0179 EBDE v2D MOS52 0227 EC0C ATOK MOS52 0179 EBDE v2D MOS52 0228 EC0C 9D 04 08 STAAX ATTN ;store as new attenuation MOS52 0179 EBDE v2D MOS52 0229 EC0F CE 39 08 DEC ATINC MOS52 0179 EBDE v2D MOS52 0230 EC12 ;the following code checks that (ATTN-PEAK)*SIGN(increment)>=0 MOS52 0179 EBDE v2D MOS52 0231 EC12 ] MOS52 0179 EBDE v2D MOS52 0232 EC12 38 SEC MOS52 0179 EBDE v2D MOS52 0233 EC13 ED 3A 08 SBC PEAK MOS52 0179 EBDE v2D MOS52 0234 EC16 4D 39 08 EOR ATINC MOS52 0179 EBDE v2D MOS52 0235 EC19 30 09 BMI SMPER ;[attenuation has not reached limit yet] MOS52 0179 EBDE v2D MOS52 0236 EC1B AD 3A 08 LDA PEAK ;attn was too large therefore set to peak MOS52 0179 EBDE v2D MOS52 0237 EC1E 9D 04 08 STAAX ATTN MOS52 0179 EBDE v2D MOS52 0238 EC21 FE 08 08 INCAX EPERD ;next envelope period MOS52 0179 EBDE v2D MOS52 0239 EC24 SMPER ;same envelope period MOS52 0179 EBDE v2D MOS52 0240 EC24 68 PLA MOS52 0179 EBDE v2D MOS52 0241 EC25 5D 04 08 EORAX ATTN MOS52 0179 EBDE v2D MOS52 0242 EC28 29 F8 ANDIM &F8 MOS52 0179 EBDE v2D MOS52 0243 EC2A F0 06 BEQ NNEWA ;no new chip attenuation output (hasn't changed)] MOS52 0179 EBDE v2D MOS52 0244 EC2C BD 04 08 LDAAX ATTN MOS52 0179 EBDE v2D MOS52 0245 EC2F 20 47 EB JSR UPATN ;update chip attenuation MOS52 0179 EBDE v2D MOS52 0246 EC32 NNEWA MOS52 0179 EBDE v2D MOS52 0247 EC32 ENDEV MOS52 0179 EBDE v2D MOS52 0248 EC32 ;frequency sweeping part of envelope MOS52 0179 EBDE v2D MOS52 0249 EC32 BD 10 08 LDAAX NPERD -- MOS52 0250 EC35 C9 03 CMPIM &03 -- MOS52 0251 EC37 F0 46 BEQ ENDSW MOS52 0251 EC37 v39 MOS52 0252 EC39 [ MOS125 = &FF MOS52 0251 EC37 v39 MOS52 0258 EC39 | MOS52 0251 EC37 v39 MOS52 0259 EC39 BC 14 08 LDYAX NCONT ;number of ticks left in this frequency period MOS52 0251 EC37 v39 MOS52 0260 EC3C D0 25 BNE GTPRD MOS52 0251 EC37 v39 MOS52 0261 EC3E FE 10 08 INCAX NPERD ;next period MOS52 0251 EC37 v39 MOS52 0262 EC41 C9 02 CMPIM &03-&01 ;check for period=3 =>end of all periods MOS52 0251 EC37 v39 MOS52 0263 EC43 38 SEC ;A=next period - 1, increment it before forming pointer MOS52 0251 EC37 v39 MOS52 0264 EC44 ] MOS52 0251 EC37 v39 MOS52 0265 EC44 D0 11 BNE NTLF ;[not last period] MOS52 0251 EC37 v39 MOS52 0266 EC46 BC 20 08 LDYAX ENVLP ;the following checks for bit 8 set in the first envelope byte=> no sweep repeat MOS52 0251 EC37 v39 MOS52 0267 EC49 B9 C0 08 LDAAY ENV MOS52 0251 EC37 v39 MOS52 0268 EC4C 30 31 BMI ENDSW ;[not a repeating sweep therefore jump to end] MOS52 0251 EC37 v39 MOS52 0269 EC4E A9 00 LDAIM ZERO MOS52 0251 EC37 v39 MOS52 0270 EC50 9D 30 08 STAAX NTADD ;reset amount added to note to zero for next sweep MOS52 0251 EC37 v39 MOS52 0271 EC53 9D 10 08 STAAX NPERD ;first sweep period MOS52 0251 EC37 v39 MOS52 0272 EC56 [ MOS125 = &FF MOS52 0251 EC37 v39 MOS52 0276 EC56 | MOS52 0251 EC37 v39 MOS52 0277 EC56 18 CLC ;A=next period, do not adjust MOS52 0251 EC37 v39 MOS52 0278 EC57 NTLF MOS52 0251 EC37 v39 MOS52 0279 EC57 ;the following points Y to the sweep parameters of the current envelope/period MOS52 0251 EC37 v39 MOS52 0280 EC57 ] MOS52 0251 EC37 v39 MOS52 0281 EC57 7D 20 08 ADCAX ENVLP MOS52 0251 EC37 v39 MOS52 0282 EC5A A8 TAY MOS52 0251 EC37 v39 MOS52 0283 EC5B B9 C4 08 LDAAY ENV+&04 MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 110 MOS52 MOS52 Sound generator MOS52 MOS52 0251 EC37 v39 MOS52 0284 EC5E 9D 14 08 STAAX NCONT ;number of cycles for this frequency period MOS52 0251 EC37 v39 MOS52 0285 EC61 F0 1C BEQ ENDSW ;zero frequency period MOS52 0251 EC37 v39 MOS52 0286 EC63 GTPRD MOS52 0251 EC37 v39 MOS52 0287 EC63 DE 14 08 DECAX NCONT MOS52 0251 EC37 v39 MOS52 0288 EC66 BD 20 08 LDAAX ENVLP MOS52 0251 EC37 v39 MOS52 0289 EC69 18 CLC MOS52 0251 EC37 v39 MOS52 0290 EC6A 7D 10 08 ADCAX NPERD MOS52 0251 EC37 v39 MOS52 0291 EC6D A8 TAY MOS52 0251 EC37 v39 MOS52 0292 EC6E B9 C1 08 LDAAY ENV+&01 ;note increment for this frequency period MOS52 0251 EC37 v39 MOS52 0293 EC71 18 CLC MOS52 0251 EC37 v39 MOS52 0294 EC72 7D 30 08 ADCAX NTADD MOS52 0251 EC37 v39 MOS52 0295 EC75 9D 30 08 STAAX NTADD ;add increment to the note offset MOS52 0251 EC37 v39 MOS52 0296 EC78 18 CLC MOS52 0251 EC37 v39 MOS52 0297 EC79 7D 0C 08 ADCAX SNOTE MOS52 0251 EC37 v39 MOS52 0298 EC7C 20 23 ED JSR CNVRT ;convert note to period and output MOS52 0251 EC37 v39 MOS52 0299 EC7F ENDSW MOS52 0251 EC37 v39 MOS52 0300 EC7F E0 04 CPXIM &04 ;'test channel number for zero' -- MOS52 0301 EC81 F0 0D BEQ EDUP ;[channel was zero therefore leave loop] MOS52 0301 EC81 v72 MOS52 0302 EC83 4C 93 EB JMP MNLOP MOS52 0301 EC81 v72 MOS52 0303 EC86 MOS52 0301 EC81 v72 MOS52 0304 EC86 MOS52 0301 EC81 v72 MOS52 0305 EC86 SNDRST MOS52 0301 EC81 v72 MOS52 0306 EC86 A2 08 LDXIM &08 MOS52 0301 EC81 v72 MOS52 0307 EC88 ; MOS52 0301 EC81 v72 MOS52 0308 EC88 RLOP MOS52 0301 EC81 v72 MOS52 0309 EC88 CA DEX MOS52 0301 EC81 v72 MOS52 0310 EC89 20 C5 EC JSR SCRST ;reset sound channel X MOS52 0301 EC81 v72 MOS52 0311 EC8C E0 04 CPXIM &04 MOS52 0301 EC81 v72 MOS52 0312 EC8E D0 F8 BNE RLOP MOS52 0301 EC81 v72 MOS52 0313 EC90 ; MOS52 0301 EC81 v72 MOS52 0314 EC90 EDUP ;end of 1/100th sec processing MOS52 0301 EC81 v72 MOS52 0315 EC90 60 RTS -- MOS52 0316 EC91 -- MOS52 0317 EC91 -- MOS52 0318 EC91 NXTNT -- MOS52 0319 EC91 BD 08 08 LDAAX EPERD ;get current amplitude period -- MOS52 0320 EC94 C9 04 CMPIM &04 ;period 4 => note has fully released -- MOS52 0321 EC96 F0 05 BEQ ELDDN MOS52 0321 EC96 v7A MOS52 0322 EC98 A9 03 LDAIM &03 MOS52 0321 EC96 v7A MOS52 0323 EC9A 9D 08 08 STAAX EPERD ;put note in the release phase of the envelope MOS52 0321 EC96 v7A MOS52 0324 EC9D ELDDN MOS52 0321 EC96 v7A MOS52 0325 EC9D BD CF 02 LDAAX FLUSH -- MOS52 0326 ECA0 F0 13 BEQ NOFL ;[no flush has been flagged] MOS52 0326 ECA0 v6C MOS52 0327 ECA2 A9 00 LDAIM ZERO MOS52 0326 ECA0 v6C MOS52 0328 ECA4 9D CF 02 STAAX FLUSH ;clear the flush flag MOS52 0326 ECA0 v6C MOS52 0329 ECA7 [ MOS125 = &FF MOS52 0326 ECA0 v6C MOS52 0344 ECA7 | MOS52 0326 ECA0 v6C MOS52 0345 ECA7 A0 03 LDYIM &03 ;the following clears all wait variables MOS52 0326 ECA0 v6C MOS52 0346 ECA9 SWTLOP MOS52 0326 ECA0 v6C MOS52 0347 ECA9 99 2C 08 STAAY WAIT +&04 MOS52 0326 ECA0 v6C MOS52 0348 ECAC 88 DEY MOS52 0326 ECA0 v6C MOS52 0349 ECAD 10 FA BPL SWTLOP MOS52 0326 ECA0 v6C MOS52 0350 ECAF 9D 18 08 STAAX DUR ;set duration to zero => note finished MOS52 0326 ECA0 v6C MOS52 0351 ECB2 8C 38 08 STY NOWAT ;reset chord building status MOS52 0326 ECA0 v6C MOS52 0352 ECB5 NOFL ;A=0 MOS52 0326 ECA0 v6C MOS52 0353 ECB5 DD 28 08 CMPAX WAIT ;check it channel waiting for chord -- MOS52 0354 ECB8 F0 43 BEQ NOTWT MOS52 0354 ECB8 v3C MOS52 0355 ECBA CD 3B 08 CMP WATGO ;check if chord now ready to play MOS52 0354 ECB8 v3C MOS52 0356 ECBD F0 34 BEQ NOTGO ;[chord not ready yet] else C=0 MOS52 0354 ECB8 v3C MOS52 0357 ECBF ] MOS52 0354 ECB8 v3C MOS52 0358 ECBF 9D 28 08 STAAX WAIT ;clear waiting for chord status MOS52 0354 ECB8 v3C MOS52 0359 ECC2 NNWAT MOS52 0354 ECB8 v3C MOS52 0360 ECC2 4C B6 ED JMP STRNT ;start playing note MOS52 0354 ECB8 v3C MOS52 0361 ECC5 SCRST ;reset sound channel X MOS52 0354 ECB8 v3C MOS52 0362 ECC5 20 40 EB JSR MINATN MOS52 0354 ECB8 v3C MOS52 0363 ECC8 98 TYA MOS52 0354 ECB8 v3C MOS52 0364 ECC9 9D 18 08 STAAX DUR MOS52 0354 ECB8 v3C MOS52 0365 ECCC 9D CF 02 STAAX FLUSH MOS52 0354 ECB8 v3C MOS52 0366 ECCF 9D 00 08 STAAX ACTIV MOS52 0354 ECB8 v3C MOS52 0367 ECD2 ; MOS52 0354 ECB8 v3C MOS52 0368 ECD2 ;clear wait periods to zero MOS52 0354 ECB8 v3C MOS52 0369 ECD2 ; MOS52 0354 ECB8 v3C MOS52 0370 ECD2 A0 03 LDYIM &03 MOS52 0354 ECB8 v3C MOS52 0371 ECD4 CWP MOS52 0354 ECB8 v3C MOS52 0372 ECD4 99 2C 08 STAAY WAIT+&04 MOS52 0354 ECB8 v3C MOS52 0373 ECD7 88 DEY MOS52 0354 ECB8 v3C MOS52 0374 ECD8 10 FA BPL CWP ;[more wait periods to clear] MOS52 0354 ECB8 v3C MOS52 0375 ECDA ; Y=$FF MOS52 0354 ECB8 v3C MOS52 0376 ECDA ; MI true MOS52 0354 ECB8 v3C MOS52 0377 ECDA ; MOS52 0354 ECB8 v3C MOS52 0378 ECDA ; indicate no channels waiting MOS52 0354 ECB8 v3C MOS52 0379 ECDA ; MOS52 0354 ECB8 v3C MOS52 0380 ECDA 8C 38 08 STY NOWAT MOS52 0354 ECB8 v3C MOS52 0381 ECDD ; MOS52 0354 ECB8 v3C MOS52 0382 ECDD 30 49 BMI FCNVRT ;[ALWAYS JUMP, set period of chip to zero] MOS52 0382 ECDD v36 MOS52 0383 ECDF MOS52 0382 ECDD v36 MOS52 0384 ECDF MOS52 0382 ECDD v36 MOS52 0385 ECDF NGONG MOS52 0382 ECDD v36 MOS52 0386 ECDF 08 PHP MOS52 0382 ECDD v36 MOS52 0387 ECE0 78 SEI MOS52 0382 ECDD v36 MOS52 0388 ECE1 BD 08 08 LDAAX EPERD ;while irq disabled check if active can be cleared MOS52 0382 ECDD v36 MOS52 0389 ECE4 C9 04 CMPIM &04 ;if envelope period=4 then note finished MOS52 0382 ECDD v36 MOS52 0390 ECE6 D0 0A BNE NOGO2 ;[note not yet released] MOS52 0382 ECDD v36 MOS52 0391 ECE8 20 9F E4 JSR EXAM ;check for recent arrival of note MOS52 0382 ECDD v36 MOS52 0392 ECEB 90 05 BCC NOGO2 ;queue no longer empty MOS52 0382 ECDD v36 MOS52 0393 ECED A9 00 LDAIM ZERO MOS52 0382 ECDD v36 MOS52 0394 ECEF 9D 00 08 STAAX ACTIV ;set channel as inactive MOS52 0382 ECDD v36 MOS52 0395 ECF2 NOGO2 MOS52 0382 ECDD v36 MOS52 0396 ECF2 28 PLP MOS52 0382 ECDD v36 MOS52 0397 ECF3 NOTGO MOS52 0382 ECDD v36 MOS52 0398 ECF3 BC 20 08 LDYAX ENVLP MOS52 0382 ECDD v36 MOS52 0399 ECF6 [ MOS125 = &FF MOS52 0382 ECDD v36 MOS52 0401 ECF6 | MOS52 0382 ECDD v36 MOS52 0402 ECF6 C8 INY MOS52 0382 ECDD v36 MOS52 0403 ECF7 ] MOS52 0382 ECDD v36 MOS52 0404 ECF7 D0 03 BNE PROG MOS52 0382 ECDD v36 MOS52 0405 ECF9 20 40 EB JSR MINATN ;update attenuation of box envelopes MOS52 0382 ECDD v36 MOS52 0406 ECFC PROG MOS52 0382 ECDD v36 MOS52 0407 ECFC PRTS ;rts pointer MOS52 0382 ECDD v36 MOS52 0408 ECFC 60 RTS MOS52 0382 ECDD v36 MOS52 0409 ECFD MOS52 0382 ECDD v36 MOS52 0410 ECFD MOS52 0382 ECDD v36 MOS52 0411 ECFD NOTWT MOS52 0382 ECDD v36 MOS52 0412 ECFD 20 9F E4 JSR EXAM ;examine byte at head of queue MOS52 0382 ECDD v36 MOS52 0413 ED00 B0 DD BCS NGONG ;[queue empty] MOS52 0382 ECDD v36 MOS52 0414 ED02 29 03 ANDIM &03 MOS52 0382 ECDD v36 MOS52 0415 ED04 F0 BC BEQ NNWAT ;[no chord commands for next note] MOS52 0382 ECDD v36 MOS52 0416 ED06 AD 38 08 LDA NOWAT MOS52 0382 ECDD v36 MOS52 0417 ED09 F0 15 BEQ SRTS ;[full chord already accepted,ignore this channel for now] MOS52 0382 ECDD v36 MOS52 0418 ED0B FE 28 08 INCAX WAIT ;set waiting flag MOS52 0382 ECDD v36 MOS52 0419 ED0E 2C 38 08 BIT NOWAT ;check for chord being built MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 111 MOS52 MOS52 Sound generator MOS52 MOS52 0382 ECDD v36 MOS52 0420 ED11 10 0A BPL SMCRD ;chord already being built MOS52 0382 ECDD v36 MOS52 0421 ED13 20 9F E4 JSR EXAM ;getheader byte again MOS52 0382 ECDD v36 MOS52 0422 ED16 29 03 ANDIM &03 ;select chord bits MOS52 0382 ECDD v36 MOS52 0423 ED18 8D 38 08 STA NOWAT ;new chord so set number of other channels required MOS52 0382 ECDD v36 MOS52 0424 ED1B 10 03 BPL LNOTGO MOS52 0382 ECDD v36 MOS52 0425 ED1D SMCRD MOS52 0382 ECDD v36 MOS52 0426 ED1D CE 38 08 DEC NOWAT ;decrement the number of channels still required for chord MOS52 0382 ECDD v36 MOS52 0427 ED20 SRTS ;must point to RTS command MOS52 0382 ECDD v36 MOS52 0428 ED20 LNOTGO MOS52 0382 ECDD v36 MOS52 0429 ED20 4C F3 EC JMP NOTGO MOS52 0382 ECDD v36 MOS52 0430 ED23 MOS52 0382 ECDD v36 MOS52 0431 ED23 MOS52 0382 ECDD v36 MOS52 0432 ED23 ;routine to convert note to period MOS52 0382 ECDD v36 MOS52 0433 ED23 ;and output to the chip MOS52 0382 ECDD v36 MOS52 0434 ED23 CNVRT MOS52 0382 ECDD v36 MOS52 0435 ED23 DD 2C 08 CMPAX OLDNTE MOS52 0382 ECDD v36 MOS52 0436 ED26 F0 D4 BEQ PRTS ;no need to update chip MOS52 0382 ECDD v36 MOS52 0437 ED28 FCNVRT ;force note output MOS52 0382 ECDD v36 MOS52 0438 ED28 9D 2C 08 STAAX OLDNTE -- MOS52 0439 ED2B E0 04 CPXIM &04 ;check if noise channel -- MOS52 0440 ED2D D0 08 BNE TONE MOS52 0440 ED2D v77 MOS52 0441 ED2F 29 0F ANDIM &0F ;noise input is only 4 bits MOS52 0440 ED2D v77 MOS52 0442 ED31 1D 76 EB ORAAX CHAN ;add channel information MOS52 0440 ED2D v77 MOS52 0443 ED34 08 PHP ;push P (will immediately be pulled) MOS52 0440 ED2D v77 MOS52 0444 ED35 [ MOS125 = &FF MOS52 0440 ED2D v77 MOS52 0446 ED35 | MOS52 0440 ED2D v77 MOS52 0447 ED35 B0 7C BCS CDONE ;output and return MOS52 0447 ED35 v03 MOS52 0448 ED37 ] MOS52 0447 ED35 v03 MOS52 0449 ED37 TONE ;tone channel MOS52 0447 ED35 v03 MOS52 0450 ED37 48 PHA MOS52 0447 ED35 v03 MOS52 0451 ED38 29 03 ANDIM &03 MOS52 0447 ED35 v03 MOS52 0452 ED3A 8D 3C 08 STA FRACT ;low 2 bits give fraction of semitone MOS52 0447 ED35 v03 MOS52 0453 ED3D [ MOS125 = &FF MOS52 0447 ED35 v03 MOS52 0465 ED3D | MOS52 0447 ED35 v03 MOS52 0466 ED3D 68 PLA MOS52 0447 ED35 v03 MOS52 0467 ED3E 4A LSRA MOS52 0447 ED35 v03 MOS52 0468 ED3F 4A LSRA MOS52 0447 ED35 v03 MOS52 0469 ED40 8D 3D 08 STA PRDL MOS52 0447 ED35 v03 MOS52 0470 ED43 OCTL MOS52 0447 ED35 v03 MOS52 0471 ED43 C9 0C CMPIM &0C ;check if note > one octave MOS52 0447 ED35 v03 MOS52 0472 ED45 90 07 BCC ENDOL MOS52 0447 ED35 v03 MOS52 0473 ED47 E9 0C SBCIM &0C MOS52 0447 ED35 v03 MOS52 0474 ED49 6E 3D 08 ROR PRDL ;use PRDL as octave counter for division MOS52 0447 ED35 v03 MOS52 0475 ED4C 30 F5 BMI OCTL ;branch always taken MOS52 0447 ED35 v03 MOS52 0476 ED4E ] MOS52 0447 ED35 v03 MOS52 0477 ED4E ENDOL MOS52 0447 ED35 v03 MOS52 0478 ED4E A8 TAY MOS52 0447 ED35 v03 MOS52 0479 ED4F AD 3D 08 LDA PRDL ;number octaves up MOS52 0447 ED35 v03 MOS52 0480 ED52 48 PHA MOS52 0447 ED35 v03 MOS52 0481 ED53 B9 14 EE LDAAY NTABL ;low period from table MOS52 0447 ED35 v03 MOS52 0482 ED56 8D 3D 08 STA PRDL MOS52 0447 ED35 v03 MOS52 0483 ED59 B9 20 EE LDAAY NTABH ;high period for lowest octave MOS52 0447 ED35 v03 MOS52 0484 ED5C 48 PHA MOS52 0447 ED35 v03 MOS52 0485 ED5D 29 03 ANDIM &03 MOS52 0447 ED35 v03 MOS52 0486 ED5F 8D 3E 08 STA PRDH MOS52 0447 ED35 v03 MOS52 0487 ED62 68 PLA ;get semitone difference from top bits of NTABH MOS52 0447 ED35 v03 MOS52 0488 ED63 4A LSRA MOS52 0447 ED35 v03 MOS52 0489 ED64 4A LSRA MOS52 0447 ED35 v03 MOS52 0490 ED65 4A LSRA MOS52 0447 ED35 v03 MOS52 0491 ED66 4A LSRA MOS52 0447 ED35 v03 MOS52 0492 ED67 8D 3F 08 STA NOTDIF MOS52 0447 ED35 v03 MOS52 0493 ED6A AD 3D 08 LDA PRDL MOS52 0447 ED35 v03 MOS52 0494 ED6D AC 3C 08 LDY FRACT ;number of times NOTDIF has to be added MOS52 0447 ED35 v03 MOS52 0495 ED70 F0 0C BEQ INTRPE ;[true semitone] MOS52 0447 ED35 v03 MOS52 0496 ED72 INTRPL MOS52 0447 ED35 v03 MOS52 0497 ED72 ;following subtracts NOTDIF from period MOS52 0447 ED35 v03 MOS52 0498 ED72 38 SEC MOS52 0447 ED35 v03 MOS52 0499 ED73 ED 3F 08 SBC NOTDIF MOS52 0447 ED35 v03 MOS52 0500 ED76 B0 03 BCS INTRPO MOS52 0447 ED35 v03 MOS52 0501 ED78 CE 3E 08 DEC PRDH MOS52 0447 ED35 v03 MOS52 0502 ED7B INTRPO MOS52 0447 ED35 v03 MOS52 0503 ED7B 88 DEY MOS52 0447 ED35 v03 MOS52 0504 ED7C D0 F4 BNE INTRPL ;[add another fraction] MOS52 0447 ED35 v03 MOS52 0505 ED7E INTRPE MOS52 0447 ED35 v03 MOS52 0506 ED7E 8D 3D 08 STA PRDL MOS52 0447 ED35 v03 MOS52 0507 ED81 68 PLA MOS52 0447 ED35 v03 MOS52 0508 ED82 [ MOS125 = &FF MOS52 0447 ED35 v03 MOS52 0516 ED82 | MOS52 0447 ED35 v03 MOS52 0517 ED82 10 09 BPL ODONE ;if lowest octave then no shifts MOS52 0447 ED35 v03 MOS52 0518 ED84 SSHIFT MOS52 0447 ED35 v03 MOS52 0519 ED84 4E 3E 08 LSR PRDH ;divide period by 2 MOS52 0447 ED35 v03 MOS52 0520 ED87 6E 3D 08 ROR PRDL MOS52 0447 ED35 v03 MOS52 0521 ED8A 0A ASLA MOS52 0447 ED35 v03 MOS52 0522 ED8B 30 F7 BMI SSHIFT ;[up another octave] MOS52 0447 ED35 v03 MOS52 0523 ED8D ] MOS52 0447 ED35 v03 MOS52 0524 ED8D ODONE MOS52 0447 ED35 v03 MOS52 0525 ED8D AD 3D 08 LDA PRDL ;extract low four bits of period MOS52 0447 ED35 v03 MOS52 0526 ED90 18 CLC MOS52 0447 ED35 v03 MOS52 0527 ED91 7D 3D C4 ADCAX SCHOFF MOS52 0447 ED35 v03 MOS52 0528 ED94 8D 3D 08 STA PRDL MOS52 0447 ED35 v03 MOS52 0529 ED97 90 03 BCC NOFOV MOS52 0447 ED35 v03 MOS52 0530 ED99 EE 3E 08 INC PRDH MOS52 0447 ED35 v03 MOS52 0531 ED9C NOFOV MOS52 0447 ED35 v03 MOS52 0532 ED9C 29 0F ANDIM &0F MOS52 0447 ED35 v03 MOS52 0533 ED9E 1D 76 EB ORAAX CHAN ;add channel address MOS52 0447 ED35 v03 MOS52 0534 EDA1 08 PHP MOS52 0447 ED35 v03 MOS52 0535 EDA2 78 SEI ;make sure another request does not mess up sequence MOS52 0447 ED35 v03 MOS52 0536 EDA3 20 5B EB JSR SEND ;output to chip MOS52 0447 ED35 v03 MOS52 0537 EDA6 AD 3D 08 LDA PRDL ;get next 6 bits of period MOS52 0447 ED35 v03 MOS52 0538 EDA9 4E 3E 08 LSR PRDH MOS52 0447 ED35 v03 MOS52 0539 EDAC 6A RORA MOS52 0447 ED35 v03 MOS52 0540 EDAD 4E 3E 08 LSR PRDH MOS52 0447 ED35 v03 MOS52 0541 EDB0 6A RORA MOS52 0447 ED35 v03 MOS52 0542 EDB1 4A LSRA ;transfer to low 6 bits of Acc MOS52 0447 ED35 v03 MOS52 0543 EDB2 4A LSRA MOS52 0447 ED35 v03 MOS52 0544 EDB3 CDONE MOS52 0447 ED35 v03 MOS52 0545 EDB3 4C 5C EB JMP SENDX ;output period to chip -- MOS52 0546 EDB6 ;routine to start note at head of queue -- MOS52 0547 EDB6 STRNT -- MOS52 0548 EDB6 08 PHP ;start indivisible section to stop new -- MOS52 0549 EDB7 78 SEI ;note being added to queue half way through extraction -- MOS52 0550 EDB8 20 A4 E4 JSR REMOV ;get byte at head queue -- MOS52 0551 EDBB [ MOS125 = &FF -- MOS52 0558 EDBB | -- MOS52 0559 EDBB A8 TAY ;save byte at head queue -- MOS52 0560 EDBC 29 04 ANDIM &04 ;extract 'continue' bit -- MOS52 0561 EDBE F0 12 BEQ NOCONT ;[not continue] MOS52 0561 EDBE v6D MOS52 0562 EDC0 BC 20 08 LDYAX ENVLP ;must check for continue to auto envelope MOS52 0561 EDBE v6D MOS52 0563 EDC3 C8 INY MOS52 0561 EDBE v6D MOS52 0564 EDC4 ] MOS52 0561 EDBE v6D MOS52 0565 EDC4 D0 03 BNE SCON1 MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 112 MOS52 MOS52 Sound generator MOS52 MOS52 0561 EDBE v6D MOS52 0566 EDC6 20 40 EB JSR MINATN ;update attenuation MOS52 0561 EDBE v6D MOS52 0567 EDC9 SCON1 MOS52 0561 EDBE v6D MOS52 0568 EDC9 20 A4 E4 JSR REMOV ;throw away note MOS52 0561 EDBE v6D MOS52 0569 EDCC 20 A4 E4 JSR REMOV ;get duration MOS52 0561 EDBE v6D MOS52 0570 EDCF 28 PLP ;end of indivisible section MOS52 0561 EDBE v6D MOS52 0571 EDD0 [ MOS125 = &FF MOS52 0561 EDBE v6D MOS52 0575 EDD0 | MOS52 0561 EDBE v6D MOS52 0576 EDD0 90 3E BCC DODUR ;C=0 from NNWAT->STRNT; always branch to update duration MOS52 0576 EDD0 v41 MOS52 0577 EDD2 NOCONT MOS52 0576 EDD0 v41 MOS52 0578 EDD2 98 TYA ;restore header byte MOS52 0576 EDD0 v41 MOS52 0579 EDD3 ] MOS52 0576 EDD0 v41 MOS52 0580 EDD3 29 F8 ANDIM &F8 ;extract 5 envelope bits MOS52 0576 EDD0 v41 MOS52 0581 EDD5 0A ASLA ;programmable envelope select bit >carry MOS52 0576 EDD0 v41 MOS52 0582 EDD6 90 0A BCC PENV ;[programmed envelope] MOS52 0576 EDD0 v41 MOS52 0583 EDD8 [ MOS125 = &FF MOS52 0576 EDD0 v41 MOS52 0588 EDD8 | MOS52 0576 EDD0 v41 MOS52 0589 EDD8 ; in: ~b3 ~b2 ~b1 ~b0 0 0 0 x MOS52 0576 EDD0 v41 MOS52 0590 EDD8 ;out: ~b3 ~b3 b2 b1 b0 1 1 1 MOS52 0576 EDD0 v41 MOS52 0591 EDD8 C9 80 CMPIM &80 ;convert box envelope to signed amplitude MOS52 0576 EDD0 v41 MOS52 0592 EDDA 6A RORA MOS52 0576 EDD0 v41 MOS52 0593 EDDB 49 3F EORIM &3F MOS52 0576 EDD0 v41 MOS52 0594 EDDD ] MOS52 0576 EDD0 v41 MOS52 0595 EDDD 20 47 EB JSR UPATN MOS52 0576 EDD0 v41 MOS52 0596 EDE0 A9 FF LDAIM &FF ;flag box envelope by setting top bit of ENVLP MOS52 0576 EDD0 v41 MOS52 0597 EDE2 PENV MOS52 0576 EDD0 v41 MOS52 0598 EDE2 9D 20 08 STAAX ENVLP ;envelope pointer,envelope*16 MOS52 0576 EDD0 v41 MOS52 0599 EDE5 A9 05 LDAIM &05 ;start timing first 1/20th second from now MOS52 0576 EDD0 v41 MOS52 0600 EDE7 9D 1C 08 STAAX DRDIV MOS52 0576 EDD0 v41 MOS52 0601 EDEA A9 01 LDAIM &01 MOS52 0576 EDD0 v41 MOS52 0602 EDEC 9D 24 08 STAAX SCONT ;first envelope update next tick MOS52 0576 EDD0 v41 MOS52 0603 EDEF [ MOS125 = &FF MOS52 0576 EDD0 v41 MOS52 0605 EDEF | MOS52 0576 EDD0 v41 MOS52 0606 EDEF 4A LSRA MOS52 0576 EDD0 v41 MOS52 0607 EDF0 ] MOS52 0576 EDD0 v41 MOS52 0608 EDF0 9D 14 08 STAAX NCONT MOS52 0576 EDD0 v41 MOS52 0609 EDF3 9D 08 08 STAAX EPERD ;first amplittude envelope MOS52 0576 EDD0 v41 MOS52 0610 EDF6 9D 30 08 STAAX NTADD ;note add envelope starts at 0 MOS52 0576 EDD0 v41 MOS52 0611 EDF9 A9 FF LDAIM &FF MOS52 0576 EDD0 v41 MOS52 0612 EDFB 9D 10 08 STAAX NPERD ;set frequency envelope to -1,incremented on first tick MOS52 0576 EDD0 v41 MOS52 0613 EDFE 20 A4 E4 JSR REMOV ;extract note byte from queue MOS52 0576 EDD0 v41 MOS52 0614 EE01 9D 0C 08 STAAX SNOTE ;store note MOS52 0576 EDD0 v41 MOS52 0615 EE04 20 A4 E4 JSR REMOV ;Remove duration MOS52 0576 EDD0 v41 MOS52 0616 EE07 28 PLP ;end of indivisible section MOS52 0576 EDD0 v41 MOS52 0617 EE08 48 PHA ;remember duration MOS52 0576 EDD0 v41 MOS52 0618 EE09 BD 0C 08 LDAAX SNOTE MOS52 0576 EDD0 v41 MOS52 0619 EE0C 20 23 ED JSR CNVRT ;convert to period and output MOS52 0576 EDD0 v41 MOS52 0620 EE0F 68 PLA ;get duration back MOS52 0576 EDD0 v41 MOS52 0621 EE10 DODUR MOS52 0576 EDD0 v41 MOS52 0622 EE10 9D 18 08 STAAX DUR ;set up duration -- MOS52 0623 EE13 60 RTS -- MOS52 0624 EE14 [ MOS125 = &FF -- MOS52 0625 EE14 | -- MOS52 0626 EE14 ;NB swapping JSR CNVRT and STAAX DUR (to save PHA/PLA) -- MOS52 0627 EE14 ;would cause an interrupt occurring during CNVRT to decrement -- MOS52 0628 EE14 ;the new count instead of the old. Preserving current order. -- MOS52 0629 EE14 ] -- MOS52 0630 EE14 -- MOS52 0631 EE14 -- MOS52 0632 EE14 NTABL ;lookup table for low 8 bit of period -- MOS52 0633 EE14 F0 = &F0 -- MOS52 0634 EE15 B7 = &B7 -- MOS52 0635 EE16 82 = &82 -- MOS52 0636 EE17 4F = &4F -- MOS52 0637 EE18 20 = &20 -- MOS52 0638 EE19 F3 = &F3 -- MOS52 0639 EE1A C8 = &C8 -- MOS52 0640 EE1B A0 = &A0 -- MOS52 0641 EE1C 7B = &7B -- MOS52 0642 EE1D 57 = &57 -- MOS52 0643 EE1E 35 = &35 -- MOS52 0644 EE1F 16 = &16 -- MOS52 0645 EE20 NTABH ;lookup table for high 2 bits of period -- MOS52 0646 EE20 E7 = &E7 ;and 6 bits of note difference being the difference -- MOS52 0647 EE21 D7 = &D7 ;between this and the next note -- MOS52 0648 EE22 CB = &CB -- MOS52 0649 EE23 C3 = &C3 -- MOS52 0650 EE24 B7 = &B7 -- MOS52 0651 EE25 AA = &AA -- MOS52 0652 EE26 A2 = &A2 -- MOS52 0653 EE27 9A = &9A -- MOS52 0654 EE28 92 = &92 -- MOS52 0655 EE29 8A = &8A -- MOS52 0656 EE2A 82 = &82 -- MOS52 0657 EE2B 7A = &7A -- MOS52 0658 EE2C -- MOS52 0659 EE2C -- MOS52 0660 EE2C LNK MOS54 -- MOS54 0001 EE2C ; MOS54 -- MOS54 0002 EE2C TTL MOS54 SPEECH DRIVING -- MOS54 0003 EE2C OPT MOS54 MOS54 MOS54 MOS54 MOS54 Acorn macro assembler Page 113 MOS54 MOS54 SPEECH DRIVING MOS54 -- MOS54 0004 EE2C ;(c) 1981 ACORN Computers Limited -- MOS54 0005 EE2C ;BBC Microcomputer Machine Operating System (MOS) -- MOS54 0006 EE2C ;Change record: -- MOS54 0007 EE2C ;004 07-Nov-81 PBM Prototype version -- MOS54 0008 EE2C ;Author(s): -- MOS54 0009 EE2C ;Paul Bond -- MOS54 0010 EE2C -- MOS54 0011 EE2C -- MOS54 0012 EE2C SRINIT ;initialise SEROM environment for CFS -- MOS54 0013 EE2C [ NOSP = &00 -- MOS54 0016 EE2C | -- MOS54 0017 EE2C A9 EF LDAIM &F0-&01 ;$01 adjusts for future INC SEROM -- MOS54 0018 EE2E ] -- MOS54 0019 EE2E ; SEROM will cycle $F0 ... $FF ... $00 ... $10 (max) -- MOS54 0020 EE2E 85 F5 STA SEROM -- MOS54 0021 EE30 [ MOS125 = &FF -- MOS54 0023 EE30 ] -- MOS54 0024 EE30 -- MOS54 0025 EE30 -- MOS54 0026 EE30 SRNEXT ;move on to next SEROM -- MOS54 0027 EE30 ; -- MOS54 0028 EE30 ; scans phrase ROM first, then paged ROM -- MOS54 0029 EE30 ; -- MOS54 0030 EE30 SPCPYF ;entry point from failed copyright message test -- MOS54 0031 EE30 A2 0D LDXIM SVISFS MOS54 0071 EE4F ^5F MOS54 0032 EE32 E6 F5 INC SEROM MOS54 0071 EE4F ^5F MOS54 0033 EE34 A4 F5 LDY SEROM MOS54 0071 EE4F ^5F MOS54 0034 EE36 [ NOSP = &00 MOS54 0071 EE4F ^5F MOS54 0039 EE36 | MOS54 0071 EE4F ^5F MOS54 0040 EE36 [ MOS125 = &7F MOS54 0071 EE4F ^5F MOS54 0041 EE36 30 05 BMI SPPH ;[process PHROM, V not altered] MOS54 0071 EE4F ^5F MOS54 0042 EE38 C0 10 CPYIM NROM ;if we get here with SEROM >= NROM, MOS54 0071 EE4F ^5F MOS54 0043 EE3A 90 39 BCC SPSV ;then no paged ROM is to respond MOS54 0043 EE3A v46 MOS54 0044 EE3C 60 RTS ;so exit C=1, call unclaimed MOS54 0043 EE3A v46 MOS54 0045 EE3D SPPH MOS54 0043 EE3A v46 MOS54 0046 EE3D | MOS54 0043 EE3A v46 MOS54 0048 EE3D ] MOS54 0043 EE3A v46 MOS54 0049 EE3D ; MOS54 0043 EE3A v46 MOS54 0050 EE3D ; process PHROM, V not altered MOS54 0043 EE3A v46 MOS54 0051 EE3D ; MOS54 0043 EE3A v46 MOS54 0052 EE3D ; no need to check for speech chip present MOS54 0043 EE3A v46 MOS54 0053 EE3D ; reads from chip will not indicate copyright message MOS54 0043 EE3A v46 MOS54 0054 EE3D ; MOS54 0043 EE3A v46 MOS54 0055 EE3D ; check for existence of speech SEROM MOS54 0043 EE3A v46 MOS54 0056 EE3D ; MOS54 0043 EE3A v46 MOS54 0057 EE3D ; set pointer to 1 MOS54 0043 EE3A v46 MOS54 0058 EE3D ; MOS54 0043 EE3A v46 MOS54 0059 EE3D A2 00 LDXIM ZERO MOS54 0043 EE3A v46 MOS54 0060 EE3F 86 F7 STX ROMPTR+&01 MOS54 0043 EE3A v46 MOS54 0061 EE41 E8 INX ;X := 1 MOS54 0043 EE3A v46 MOS54 0062 EE42 86 F6 STX ROMPTR+&00 MOS54 0043 EE3A v46 MOS54 0063 EE44 20 D7 EE JSR SPLOAD ;set address MOS54 0043 EE3A v46 MOS54 0064 EE47 ; MOS54 0043 EE3A v46 MOS54 0065 EE47 ; check for copyright (C) MOS54 0043 EE3A v46 MOS54 0066 EE47 ; MOS54 0043 EE3A v46 MOS54 0067 EE47 A2 03 LDXIM &03 MOS54 0043 EE3A v46 MOS54 0068 EE49 SPCPY ;V not altered MOS54 0043 EE3A v46 MOS54 0069 EE49 20 7E EE JSR RDBYTE ;does not alter X MOS54 0043 EE3A v46 MOS54 0070 EE4C DD 29 F5 CMPAX COPYR MOS54 0043 EE3A v46 MOS54 0071 EE4F D0 DF BNE SPCPYF ;[failed test for copyright message] MOS54 0043 EE3A v46 MOS54 0072 EE51 ; C=1 MOS54 0043 EE3A v46 MOS54 0073 EE51 CA DEX MOS54 0043 EE3A v46 MOS54 0074 EE52 10 F5 BPL SPCPY MOS54 0043 EE3A v46 MOS54 0075 EE54 ; MOS54 0043 EE3A v46 MOS54 0076 EE54 ; C=1 MOS54 0043 EE3A v46 MOS54 0077 EE54 ; MOS54 0043 EE3A v46 MOS54 0078 EE54 ; copyright message is present MOS54 0043 EE3A v46 MOS54 0079 EE54 ; MOS54 0043 EE3A v46 MOS54 0080 EE54 ; we have read 5 bytes so far MOS54 0043 EE3A v46 MOS54 0081 EE54 ; skip more bytes allowing for copyright/title strings MOS54 0043 EE3A v46 MOS54 0082 EE54 ; MOS54 0043 EE3A v46 MOS54 0083 EE54 ; position serial ROM to cassette image data MOS54 0043 EE3A v46 MOS54 0084 EE54 ; (indirect pointer held at offset $3E) MOS54 0043 EE3A v46 MOS54 0085 EE54 ; MOS54 0043 EE3A v46 MOS54 0086 EE54 A9 3E LDAIM &3E MOS54 0043 EE3A v46 MOS54 0087 EE56 85 F6 STA ROMPTR+&00 MOS54 0043 EE3A v46 MOS54 0088 EE58 ; MOS54 0043 EE3A v46 MOS54 0089 EE58 ; C=1 MOS54 0043 EE3A v46 MOS54 0090 EE58 ; MOS54 0043 EE3A v46 MOS54 0091 EE58 SPLIND ;load address indirect, V not altered, returns C=0 MOS54 0043 EE3A v46 MOS54 0092 EE58 20 D7 EE JSR SPLOAD MOS54 0043 EE3A v46 MOS54 0093 EE5B [ TRUE=0 MOS54 0043 EE3A v46 MOS54 0094 EE5B ; perform soft version of read-and-branch MOS54 0043 EE3A v46 MOS54 0095 EE5B ; MOS54 0043 EE3A v46 MOS54 0096 EE5B A2 FF LDXIM &FF MOS54 0043 EE3A v46 MOS54 0097 EE5D RABLP MOS54 0043 EE3A v46 MOS54 0098 EE5D ; read lo byte when X=0, hi byte when X=1 MOS54 0043 EE3A v46 MOS54 0099 EE5D 20 7E EE JSR RDBYTE ;does not corrupt X MOS54 0043 EE3A v46 MOS54 0100 EE60 ; MOS54 0043 EE3A v46 MOS54 0101 EE60 [ MOS125 = &FF MOS54 0043 EE3A v46 MOS54 0108 EE60 | MOS54 0043 EE3A v46 MOS54 0109 EE60 38 SEC ;C undefined if entered at SPLIND MOS54 0043 EE3A v46 MOS54 0110 EE61 2A ROLA MOS54 0043 EE3A v46 MOS54 0111 EE62 RABLO ;reverse bits in A into ROMPTR+(0/1) MOS54 0043 EE3A v46 MOS54 0112 EE62 76 F7 RORAX ROMPTR+&01 MOS54 0043 EE3A v46 MOS54 0113 EE64 0A ASLA MOS54 0043 EE3A v46 MOS54 0114 EE65 D0 FB BNE RABLO ;[process 8 bits] MOS54 0043 EE3A v46 MOS54 0115 EE67 ; C=1, Y clobbered in SPLOAD->SPL->SPL1 MOS54 0043 EE3A v46 MOS54 0116 EE67 ] MOS54 0043 EE3A v46 MOS54 0117 EE67 ; MOS54 0043 EE3A v46 MOS54 0118 EE67 E8 INX MOS54 0043 EE3A v46 MOS54 0119 EE68 F0 F3 BEQ RABLP ;repeat loop once more with X=0 MOS54 0043 EE3A v46 MOS54 0120 EE6A ; MOS54 0043 EE3A v46 MOS54 0121 EE6A 18 CLC ;indicate next successful MOS54 0043 EE3A v46 MOS54 0122 EE6B 90 6A BCC SPLOAD ;[ALWAYS jump, set indirected address AND return] MOS54 0122 EE6B v15 MOS54 0123 EE6D | MOS54 0122 EE6B v15 MOS54 0136 EE6D ] MOS54 0122 EE6B v15 MOS54 0137 EE6D ] MOS54 0122 EE6B v15 MOS54 0138 EE6D MOS54 0122 EE6B v15 MOS54 0139 EE6D MOS54 0122 EE6B v15 MOS54 0140 EE6D RDSPCH ;read byte from SEROM MOS54 0122 EE6B v15 MOS54 0141 EE6D A2 0E LDXIM SVRSFS MOS54 0122 EE6B v15 MOS54 0142 EE6F [ NOSP = &00 MOS54 0122 EE6B v15 MOS54 0144 EE6F | MOS54 0122 EE6B v15 MOS54 0145 EE6F A4 F5 LDY SEROM MOS54 0122 EE6B v15 MOS54 0146 EE71 30 0B BMI RDBYTE ;[reading from PHROM, V not altered] MOS54 0122 EE6B v15 MOS54 0147 EE73 ] MOS54 0122 EE6B v15 MOS54 0148 EE73 ; MOS54 0122 EE6B v15 MOS54 0149 EE73 ; reading from paged ROM MOS54 0122 EE6B v15 MOS54 0150 EE73 ; MOS54 0122 EE6B v15 MOS54 0151 EE73 A0 FF LDYIM 0-MCVER ;enter paged ROM with M/C indicator in Y MOS54 MOS54 MOS54 MOS54 Acorn macro assembler Page 114 MOS54 MOS54 SPEECH DRIVING MOS54 MOS54 0122 EE6B v15 MOS54 0152 EE75 ; MOS54 0122 EE6B v15 MOS54 0153 EE75 SPSV ;used by read byte routine, V not altered MOS54 0122 EE6B v15 MOS54 0154 EE75 08 PHP MOS54 0122 EE6B v15 MOS54 0155 EE76 20 74 F1 JSR SVOP ;search for paged SEROM (N.B. SVOPSP) MOS54 0122 EE6B v15 MOS54 0156 EE79 ; MOS54 0122 EE6B v15 MOS54 0157 EE79 28 PLP ;restore V-flag MOS54 0122 EE6B v15 MOS54 0158 EE7A C9 01 CMPIM &01 ;claimed => C=0, not claimed => C=1 MOS54 0122 EE6B v15 MOS54 0159 EE7C 98 TYA ;A := read character (useful for read byte routine only) MOS54 0122 EE6B v15 MOS54 0160 EE7D 60 RTS MOS54 0122 EE6B v15 MOS54 0161 EE7E MOS54 0122 EE6B v15 MOS54 0162 EE7E MOS54 0122 EE6B v15 MOS54 0163 EE7E [ NOSP = &00 MOS54 0122 EE6B v15 MOS54 0166 EE7E | MOS54 0122 EE6B v15 MOS54 0167 EE7E RDBYTE ;read byte from speech ROM, V not altered MOS54 0122 EE6B v15 MOS54 0168 EE7E 08 PHP MOS54 0122 EE6B v15 MOS54 0169 EE7F 78 SEI MOS54 0122 EE6B v15 MOS54 0170 EE80 A0 10 LDYIM SPOPRB ;set to read byte MOS54 0122 EE6B v15 MOS54 0171 EE82 20 9B EE JSR WSPECH MOS54 0122 EE6B v15 MOS54 0172 EE85 ; read byte (following code shorter than JSR RSPECH; PLP; RTS) MOS54 0122 EE6B v15 MOS54 0173 EE85 A0 00 LDYIM ZERO MOS54 0122 EE6B v15 MOS54 0174 EE87 F0 17 BEQ SENDSX ;[ALWAYS JUMP, N.B. does PLP & RTS, SEI already active] MOS54 0122 EE6B v15 MOS54 0175 EE89 MOS54 0122 EE6B v15 MOS54 0176 EE89 MOS54 0122 EE6B v15 MOS54 0177 EE89 RSPECH ;read from speech processor, must not corrupt X MOS54 0122 EE6B v15 MOS54 0178 EE89 A0 00 LDYIM ZERO MOS54 0122 EE6B v15 MOS54 0179 EE8B F0 11 BEQ SENDSP ;[ALWAYS jump] MOS54 0122 EE6B v15 MOS54 0180 EE8D ; MOS54 0122 EE6B v15 MOS54 0181 EE8D ; MOS54 0122 EE6B v15 MOS54 0182 EE8D SPL ;send load address nibbles MOS54 0122 EE6B v15 MOS54 0183 EE8D ; A = hl MOS54 0122 EE6B v15 MOS54 0184 EE8D ; h is hi-nibble MOS54 0122 EE6B v15 MOS54 0185 EE8D ; l is lo-nibble MOS54 0122 EE6B v15 MOS54 0186 EE8D 48 PHA MOS54 0122 EE6B v15 MOS54 0187 EE8E 20 96 EE JSR SPL1 ;send lo-nibble MOS54 0122 EE6B v15 MOS54 0188 EE91 68 PLA MOS54 0122 EE6B v15 MOS54 0189 EE92 6A RORA MOS54 0122 EE6B v15 MOS54 0190 EE93 6A RORA MOS54 0122 EE6B v15 MOS54 0191 EE94 6A RORA MOS54 0122 EE6B v15 MOS54 0192 EE95 6A RORA MOS54 0122 EE6B v15 MOS54 0193 EE96 ; MOS54 0122 EE6B v15 MOS54 0194 EE96 ; send hi-nibble MOS54 0122 EE6B v15 MOS54 0195 EE96 ; MOS54 0122 EE6B v15 MOS54 0196 EE96 SPL1 MOS54 0122 EE6B v15 MOS54 0197 EE96 29 0F ANDIM &0F ;isolate lo-nibble MOS54 0122 EE6B v15 MOS54 0198 EE98 09 40 ORAIM SPOPLA MOS54 0122 EE6B v15 MOS54 0199 EE9A ; MOS54 0122 EE6B v15 MOS54 0200 EE9A A8 TAY ;Y := command MOS54 0122 EE6B v15 MOS54 0201 EE9B ; MOS54 0122 EE6B v15 MOS54 0202 EE9B WSPECH ;write to speech processor, must not corrupt X MOS54 0122 EE6B v15 MOS54 0203 EE9B 98 TYA ;A := command MOS54 0122 EE6B v15 MOS54 0204 EE9C A0 01 LDYIM &01 MOS54 0122 EE6B v15 MOS54 0205 EE9E ; MOS54 0122 EE6B v15 MOS54 0206 EE9E SENDSP ;read/write from/to speech processor MOS54 0122 EE6B v15 MOS54 0207 EE9E ; Y=0 => read MOS54 0122 EE6B v15 MOS54 0208 EE9E ; Y=1 => write MOS54 0122 EE6B v15 MOS54 0209 EE9E 08 PHP MOS54 0122 EE6B v15 MOS54 0210 EE9F 78 SEI MOS54 0122 EE6B v15 MOS54 0211 EEA0 SENDSX ;entry used by routines which have done a PHP & SEI MOS54 0122 EE6B v15 MOS54 0212 EEA0 2C 7B 02 BIT SPFLAG MOS54 0122 EE6B v15 MOS54 0213 EEA3 10 21 BPL SNDSX0 ;[speech chip not present] MOS54 0122 EE6B v15 MOS54 0214 EEA5 ; MOS54 0122 EE6B v15 MOS54 0215 EEA5 48 PHA ;save command MOS54 0122 EE6B v15 MOS54 0216 EEA6 ; MOS54 0122 EE6B v15 MOS54 0217 EEA6 ; select PA7-0 as inputs/outputs MOS54 0122 EE6B v15 MOS54 0218 EEA6 ; MOS54 0122 EE6B v15 MOS54 0219 EEA6 B9 84 F0 LDAAY SENDD MOS54 0122 EE6B v15 MOS54 0220 EEA9 8D 43 FE STA DDRAQ MOS54 0122 EE6B v15 MOS54 0221 EEAC ; MOS54 0122 EE6B v15 MOS54 0222 EEAC ; place command onto data bus MOS54 0122 EE6B v15 MOS54 0223 EEAC ; MOS54 0122 EE6B v15 MOS54 0224 EEAC 68 PLA ;restore command MOS54 0122 EE6B v15 MOS54 0225 EEAD 8D 4F FE STA PAPQ MOS54 0122 EE6B v15 MOS54 0226 EEB0 ; MOS54 0122 EE6B v15 MOS54 0227 EEB0 ; speech enable MOS54 0122 EE6B v15 MOS54 0228 EEB0 ; MOS54 0122 EE6B v15 MOS54 0229 EEB0 B9 86 F0 LDAAY SENDS MOS54 0122 EE6B v15 MOS54 0230 EEB3 8D 40 FE STA PBQ MOS54 0122 EE6B v15 MOS54 0231 EEB6 ; MOS54 0122 EE6B v15 MOS54 0232 EEB6 ; wait for speech ready MOS54 0122 EE6B v15 MOS54 0233 EEB6 ; MOS54 0122 EE6B v15 MOS54 0234 EEB6 SPWAIT MOS54 0122 EE6B v15 MOS54 0235 EEB6 2C 40 FE BIT PBQ MOS54 0122 EE6B v15 MOS54 0236 EEB9 30 FB BMI SPWAIT ;[not ready] MOS54 0122 EE6B v15 MOS54 0237 EEBB ; MOS54 0122 EE6B v15 MOS54 0238 EEBB ; read possible speech data MOS54 0122 EE6B v15 MOS54 0239 EEBB ; MOS54 0122 EE6B v15 MOS54 0240 EEBB AD 4F FE LDA PAPQ MOS54 0122 EE6B v15 MOS54 0241 EEBE 48 PHA MOS54 0122 EE6B v15 MOS54 0242 EEBF ; MOS54 0122 EE6B v15 MOS54 0243 EEBF ; speech disable MOS54 0122 EE6B v15 MOS54 0244 EEBF ; MOS54 0122 EE6B v15 MOS54 0245 EEBF B9 88 F0 LDAAY SENDF MOS54 0122 EE6B v15 MOS54 0246 EEC2 8D 40 FE STA PBQ MOS54 0122 EE6B v15 MOS54 0247 EEC5 ; MOS54 0122 EE6B v15 MOS54 0248 EEC5 ; return MOS54 0122 EE6B v15 MOS54 0249 EEC5 ; MOS54 0122 EE6B v15 MOS54 0250 EEC5 68 PLA ;restore speech data (not relevant if write) MOS54 0122 EE6B v15 MOS54 0251 EEC6 ; MOS54 0122 EE6B v15 MOS54 0252 EEC6 SNDSX0 MOS54 0122 EE6B v15 MOS54 0253 EEC6 28 PLP MOS54 0122 EE6B v15 MOS54 0254 EEC7 A8 TAY ;set processor status flags (useful for RSPECH) and Y (for FX calls) MOS54 0122 EE6B v15 MOS54 0255 EEC8 60 RTS MOS54 0122 EE6B v15 MOS54 0256 EEC9 ] MOS54 0122 EE6B v15 MOS54 0257 EEC9 MOS54 0122 EE6B v15 MOS54 0258 EEC9 MOS54 0122 EE6B v15 MOS54 0259 EEC9 SRSKIP ;skip to SEROM pointer indicated by SRPTR MOS54 0122 EE6B v15 MOS54 0260 EEC9 AD CB 03 LDA SRPTR+&00 MOS54 0122 EE6B v15 MOS54 0261 EECC 85 F6 STA ROMPTR+&00 MOS54 0122 EE6B v15 MOS54 0262 EECE AD CC 03 LDA SRPTR+&01 MOS54 0122 EE6B v15 MOS54 0263 EED1 85 F7 STA ROMPTR+&01 MOS54 0122 EE6B v15 MOS54 0264 EED3 [ NOSP = &00 MOS54 0122 EE6B v15 MOS54 0265 EED3 | MOS54 0122 EE6B v15 MOS54 0266 EED3 A5 F5 LDA SEROM MOS54 0122 EE6B v15 MOS54 0267 EED5 10 1B BPL SRSK0 ;[skipping within paged ROM] MOS54 0122 EE6B v15 MOS54 0268 EED7 ; MOS54 0122 EE6B v15 MOS54 0269 EED7 ; skipping within speech SEROM MOS54 0122 EE6B v15 MOS54 0270 EED7 ; load address from SEROM/ROMPTR MOS54 0122 EE6B v15 MOS54 0271 EED7 ; MOS54 0122 EE6B v15 MOS54 0272 EED7 SPLOAD ;load address, must not corrupt V MOS54 0122 EE6B v15 MOS54 0273 EED7 ; address given in SEROM/ROMPTR MOS54 0122 EE6B v15 MOS54 0274 EED7 08 PHP MOS54 MOS54 MOS54 MOS54 Acorn macro assembler Page 115 MOS54 MOS54 SPEECH DRIVING MOS54 MOS54 0267 EED5 v64 MOS54 0275 EED8 78 SEI ;N.B. uses SPWK1 MOS54 0267 EED5 v64 MOS54 0276 EED9 A5 F6 LDA ROMPTR+&00 MOS54 0267 EED5 v64 MOS54 0277 EEDB 20 8D EE JSR SPL ;send address lo-byte MOS54 0267 EED5 v64 MOS54 0278 EEDE [ MOS125 = &FF MOS54 0267 EED5 v64 MOS54 0291 EEDE | MOS54 0267 EED5 v64 MOS54 0292 EEDE A5 F5 LDA SEROM MOS54 0267 EED5 v64 MOS54 0293 EEE0 4A LSRA MOS54 0267 EED5 v64 MOS54 0294 EEE1 6A RORA MOS54 0267 EED5 v64 MOS54 0295 EEE2 48 PHA MOS54 0267 EED5 v64 MOS54 0296 EEE3 6A RORA MOS54 0267 EED5 v64 MOS54 0297 EEE4 45 F7 EOR ROMPTR+&01 MOS54 0267 EED5 v64 MOS54 0298 EEE6 29 C0 ANDIM &C0 MOS54 0267 EED5 v64 MOS54 0299 EEE8 45 F7 EOR ROMPTR+&01 MOS54 0267 EED5 v64 MOS54 0300 EEEA 20 8D EE JSR SPL ;send address hi-byte MOS54 0267 EED5 v64 MOS54 0301 EEED 68 PLA MOS54 0267 EED5 v64 MOS54 0302 EEEE 20 96 EE JSR SPL1 ;send address hi-nibble MOS54 0267 EED5 v64 MOS54 0303 EEF1 ] MOS54 0267 EED5 v64 MOS54 0304 EEF1 28 PLP MOS54 0267 EED5 v64 MOS54 0305 EEF2 SRSK0 MOS54 0267 EED5 v64 MOS54 0306 EEF2 ] MOS54 0267 EED5 v64 MOS54 0307 EEF2 60 RTS -- MOS54 0308 EEF3 -- MOS54 0309 EEF3 -- MOS54 0310 EEF3 [ FALSE=0 -- MOS54 0323 EEF3 ] -- MOS54 0324 EEF3 -- MOS54 0325 EEF3 -- MOS54 0326 EEF3 < &0001 -- MOS54 0327 EEF3 -- MOS54 0328 EEF3 -- MOS54 0329 EEF3 LNK MOS56 -- MOS56 0001 EEF3 -- MOS56 0002 EEF3 ; > MOS56 -- MOS56 0003 EEF3 TTL MOS56 Keyboard management -- MOS56 0004 EEF3 OPT MOS56 MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 116 MOS56 MOS56 Keyboard management MOS56 -- MOS56 0005 EEF3 ;(c) 1981 ACORN Computers Limited -- MOS56 0006 EEF3 ;BBC Microcomputer Machine Operating System (MOS) -- MOS56 0007 EEF3 ;Change record: -- MOS56 0008 EEF3 ;202 01-May-82 PB Programmable TAB key -- MOS56 0009 EEF3 ;.05 16-Nov-81 PB Fix CTRL/SHIFT matrix h/w problem -- MOS56 0010 EEF3 ;100 04-Sep-81 PB Remove SHIFT and CTRL debounce -- MOS56 0011 EEF3 ;Author(s): -- MOS56 0012 EEF3 ;PB Paul Bond -- MOS56 0013 EEF3 ;MP Mike Prees -- MOS56 0014 EEF3 ; STATUS BYTE USES (KSTAT) -- MOS56 0015 EEF3 ; N.B. status byte is NEVER zero -- MOS56 0016 EEF3 ; (CAPITALS and SHIFT lock never concurrent) -- MOS56 0017 EEF3 ; BIT 0 not used -- MOS56 0018 EEF3 ; BIT 1 not used -- MOS56 0019 EEF3 ; BIT 2 not used -- MOS56 0020 EEF3 ; BIT 3 SHIFT -- MOS56 0021 EEF3 ; BIT 4 not CAPITALS lock -- MOS56 0022 EEF3 ; BIT 5 not SHIFT lock -- MOS56 0023 EEF3 ; BIT 6 CTRL -- MOS56 0024 EEF3 ; BIT 7 shift enable (only meaningful if a lock is active) -- MOS56 0025 EEF3 ; SEQUENCE OF EVENTS :- -- MOS56 0026 EEF3 ; 1. CHECK SHIFT KEY -- MOS56 0027 EEF3 ; 2. CHECK CONTROL KEY -- MOS56 0028 EEF3 ; 3. PROCESS CURRENT KEY -- MOS56 0029 EEF3 ; 4. PROCESS OLD KEY -- MOS56 0030 EEF3 ; 5. SCAN KEYS IF REQ'D -- MOS56 0031 EEF3 ; 6. ENABLE CA2 IF REQ'D -- MOS56 0032 EEF3 -- MOS56 0033 EEF3 -- MOS56 0034 EEF3 KBDAW -- MOS56 0035 EEF3 A2 FF LDXIM &FF ;prepare to enable keyboard timer interrupts -- MOS56 0036 EEF5 ; -- MOS56 0037 EEF5 ; IF ALL KEYS UP & FORGOTTEN, RESTORE INTERRUPTS -- MOS56 0038 EEF5 ; -- MOS56 0039 EEF5 A5 EC LDA CKEY -- MOS56 0040 EEF7 05 ED ORA OKEY -- MOS56 0041 EEF9 D0 06 BNE KBDISX ;[at least one active key, so keep keyboard interrupt disabled] MOS56 0041 EEF9 v79 MOS56 0042 EEFB ; MOS56 0041 EEF9 v79 MOS56 0043 EEFB ; enable keyboard interrupt MOS56 0041 EEF9 v79 MOS56 0044 EEFB ; MOS56 0041 EEF9 v79 MOS56 0045 EEFB A9 81 LDAIM &81 MOS56 0041 EEF9 v79 MOS56 0046 EEFD 8D 4E FE STA IERQ MOS56 0041 EEF9 v79 MOS56 0047 EF00 E8 INX ;X:=0, disable keyboard timer interrupts MOS56 0041 EEF9 v79 MOS56 0048 EF01 ; MOS56 0041 EEF9 v79 MOS56 0049 EF01 KBDISX MOS56 0041 EEF9 v79 MOS56 0050 EF01 8E 42 02 STX KSEMA ;set keyboard timer interrupt control flag -- MOS56 0051 EF04 ; $00 => disabled, $FF => enabled -- MOS56 0052 EF04 ; -- MOS56 0053 EF04 KBDIS -- MOS56 0054 EF04 08 PHP MOS56 0127 EF47 ^3B MOS56 0055 EF05 ; disable keyboard, coping with CAPITALS & SHIFT lock LEDs MOS56 0127 EF47 ^3B MOS56 0056 EF05 AD 5A 02 LDA KSTAT MOS56 0127 EF47 ^3B MOS56 0057 EF08 ; isolate CAPITALS lock and SHIFT lock states MOS56 0127 EF47 ^3B MOS56 0058 EF08 4A LSRA MOS56 0127 EF47 ^3B MOS56 0059 EF09 29 18 ANDIM &18 MOS56 0127 EF47 ^3B MOS56 0060 EF0B ; update LED1 (CAPITALS lock) MOS56 0127 EF47 ^3B MOS56 0061 EF0B 09 06 ORAIM &06 ;use addressable latch output 6 MOS56 0127 EF47 ^3B MOS56 0062 EF0D 8D 40 FE STA PBQ ;store LED1 MOS56 0127 EF47 ^3B MOS56 0063 EF10 ; update LED2 (SHIFT lock) MOS56 0127 EF47 ^3B MOS56 0064 EF10 4A LSRA ;move state into bit3 MOS56 0127 EF47 ^3B MOS56 0065 EF11 09 07 ORAIM &07 ;use addressable latch output 7 MOS56 0127 EF47 ^3B MOS56 0066 EF13 8D 40 FE STA PBQ ;store LED2 MOS56 0127 EF47 ^3B MOS56 0067 EF16 ; MOS56 0127 EF47 ^3B MOS56 0068 EF16 [ TRUE=0 MOS56 0127 EF47 ^3B MOS56 0069 EF16 20 3A F1 JSR KALLOX MOS56 0127 EF47 ^3B MOS56 0070 EF19 | MOS56 0127 EF47 ^3B MOS56 0073 EF19 ] MOS56 0127 EF47 ^3B MOS56 0074 EF19 ; MOS56 0127 EF47 ^3B MOS56 0075 EF19 68 PLA MOS56 0127 EF47 ^3B MOS56 0076 EF1A 60 RTS MOS56 0127 EF47 ^3B MOS56 0077 EF1B MOS56 0127 EF47 ^3B MOS56 0078 EF1B DEFKEY ;keyboard control effect MOS56 0127 EF47 ^3B MOS56 0079 EF1B ; MOS56 0127 EF47 ^3B MOS56 0080 EF1B ; entered with: MOS56 0127 EF47 ^3B MOS56 0081 EF1B ; C=0, V=0 => SHIFT/CTRL test MOS56 0127 EF47 ^3B MOS56 0082 EF1B ; C=1, V=0 => keyboard scan MOS56 0127 EF47 ^3B MOS56 0083 EF1B ; C=0, V=1 => keyboard interrupt MOS56 0127 EF47 ^3B MOS56 0084 EF1B ; C=1, V=1 => timer interrupt MOS56 0127 EF47 ^3B MOS56 0085 EF1B ; MOS56 0127 EF47 ^3B MOS56 0086 EF1B ; route keyboard entry reason MOS56 0127 EF47 ^3B MOS56 0087 EF1B ; MOS56 0127 EF47 ^3B MOS56 0088 EF1B 50 0A BVC KEYV0 ;[V=0] MOS56 0127 EF47 ^3B MOS56 0089 EF1D ; MOS56 0127 EF47 ^3B MOS56 0090 EF1D A9 01 LDAIM &01 MOS56 0127 EF47 ^3B MOS56 0091 EF1F 8D 4E FE STA IERQ MOS56 0127 EF47 ^3B MOS56 0092 EF22 ; MOS56 0127 EF47 ^3B MOS56 0093 EF22 B0 08 BCS KYBD ;[timer interrupt entry] MOS56 0127 EF47 ^3B MOS56 0094 EF24 4C 1E F0 JMP KBDAT ;[keyboard interrupt] MOS56 0127 EF47 ^3B MOS56 0095 EF27 ; MOS56 0127 EF47 ^3B MOS56 0096 EF27 KEYV0 MOS56 0127 EF47 ^3B MOS56 0097 EF27 90 06 BCC TSHIFT ;[SHIFT/CTRL test] MOS56 0127 EF47 ^3B MOS56 0098 EF29 4C DD F0 JMP SKFMA ;C=1, scan keyboard MOS56 0127 EF47 ^3B MOS56 0099 EF2C MOS56 0127 EF47 ^3B MOS56 0100 EF2C KYBD ;C=1 MOS56 0127 EF47 ^3B MOS56 0101 EF2C ; entered when key(s) active AND timer interrupt MOS56 0127 EF47 ^3B MOS56 0102 EF2C ; MOS56 0127 EF47 ^3B MOS56 0103 EF2C ; ensure no more keyboard timer interrupts MOS56 0127 EF47 ^3B MOS56 0104 EF2C EE 42 02 INC KSEMA ;KSEMA := 0 MOS56 0127 EF47 ^3B MOS56 0105 EF2F ; MOS56 0127 EF47 ^3B MOS56 0106 EF2F TSHIFT ;C=0 MOS56 0127 EF47 ^3B MOS56 0107 EF2F ; entry point used by test shift routine (uses C=1) MOS56 0127 EF47 ^3B MOS56 0108 EF2F ; clear SHIFT and CTRL status MOS56 0127 EF47 ^3B MOS56 0109 EF2F AD 5A 02 LDA KSTAT MOS56 0127 EF47 ^3B MOS56 0110 EF32 29 B7 ANDIM CTLSHI ;N.B. A will accumulate new state MOS56 0127 EF47 ^3B MOS56 0111 EF34 ; set SHIFT key status MOS56 0127 EF47 ^3B MOS56 0112 EF34 A2 00 LDXIM ZERO ;N.B. SHIFT key is at matrix entry 0 MOS56 0127 EF47 ^3B MOS56 0113 EF36 20 39 F0 JSR KC ;get state of SHIFT key MOS56 0127 EF47 ^3B MOS56 0114 EF39 ; N.B. C not corrupted MOS56 0127 EF47 ^3B MOS56 0115 EF39 86 FA STX KTEMP ;save state of SHIFT key for SHIFT/CAPS invert feature MOS56 0127 EF47 ^3B MOS56 0116 EF3B ; KTEMP = 1xxx xxxx => SHIFT MOS56 0127 EF47 ^3B MOS56 0117 EF3B ; KTEMP = 0xxx xxxx => no SHIFT MOS56 0127 EF47 ^3B MOS56 0118 EF3B B8 CLV MOS56 0127 EF47 ^3B MOS56 0119 EF3C 10 05 BPL KYBD1 ;[SHIFT key not active] MOS56 0127 EF47 ^3B MOS56 0120 EF3E ; shift key active and within timer interrupt routine MOS56 0127 EF47 ^3B MOS56 0121 EF3E 2C 49 D9 BIT FFBYT MOS56 0127 EF47 ^3B MOS56 0122 EF41 09 08 ORAIM SHFT MOS56 0127 EF47 ^3B MOS56 0123 EF43 KYBD1 MOS56 0127 EF47 ^3B MOS56 0124 EF43 ; set CTRL key status MOS56 0127 EF47 ^3B MOS56 0125 EF43 E8 INX ;X := 1, N.B. CTRL key is at matrix entry 1 MOS56 0127 EF47 ^3B MOS56 0126 EF44 20 39 F0 JSR KC ;get state of CTRL key MOS56 0127 EF47 ^3B MOS56 0127 EF47 90 BB BCC KBDIS ;[testing CTRL and SHIFT, MI=>CTRL, V=>SHIFT] MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 117 MOS56 MOS56 Keyboard management MOS56 -- MOS56 0128 EF49 10 02 BPL KYBD2 ;[CTRL key not active] MOS56 0128 EF49 v7D MOS56 0129 EF4B ; CTRL key active MOS56 0128 EF49 v7D MOS56 0130 EF4B 09 40 ORAIM CTRL MOS56 0128 EF49 v7D MOS56 0131 EF4D KYBD2 ;A has accumulated new keyboard status MOS56 0128 EF49 v7D MOS56 0132 EF4D 8D 5A 02 STA KSTAT ;update keyboard status -- MOS56 0133 EF50 ; evaluate status of the current key -- MOS56 0134 EF50 ; IF IT IS & WAS OPEN, THEN FORGET IT -- MOS56 0135 EF50 ; IF OPEN & WAS CLOSED, MARK AS OPEN -- MOS56 0136 EF50 ; IF CLOSED & WAS OPEN, MARK AS CLOSED -- MOS56 0137 EF50 ; IF CLOSED & WAS CLOSED, THEN DECREMENT -- MOS56 0138 EF50 ; AUTO-REPEAT COUNTER. IF THIS GOES TO -- MOS56 0139 EF50 ; ZERO (IT STARTS AT 1 INITIALLY) THEN -- MOS56 0140 EF50 ; TRANSMIT CHARACTER TO RDCH BUFFER -- MOS56 0141 EF50 ; (UNLESS IT IS SHF LOCK OR CAPS LOCK) -- MOS56 0142 EF50 ; IF AUTO REPEAT PERMANENTLY DISABLED -- MOS56 0143 EF50 ; THEN DON'T RESET THIS COUNTER. -- MOS56 0144 EF50 A6 EC LDX CKEY -- MOS56 0145 EF52 F0 12 BEQ KBDWU ;[no current key] MOS56 0145 EF52 v6D MOS56 0146 EF54 ; current key exists MOS56 0145 EF52 v6D MOS56 0147 EF54 20 39 F0 JSR KC ;get status of current key MOS56 0145 EF52 v6D MOS56 0148 EF57 30 10 BMI KBDX ;[current key closed] MOS56 0145 EF52 v6D MOS56 0149 EF59 ; current key open MOS56 0145 EF52 v6D MOS56 0150 EF59 E4 EC CPX CKEY MOS56 0145 EF52 v6D MOS56 0151 EF5B KBDW MOS56 0145 EF52 v6D MOS56 0152 EF5B 86 EC STX CKEY ;update open/closed state of current key MOS56 0145 EF52 v6D MOS56 0153 EF5D D0 07 BNE KBDWU ;[current key: is open was closed, or is closed was open] MOS56 0145 EF52 v6D MOS56 0154 EF5F ; CURRENT KEY HAS BEEN OPEN FOR TWO CLOCK MOS56 0145 EF52 v6D MOS56 0155 EF5F ; CYCLES, SO 'FORGET' IT BY ZEROING CKEY MOS56 0145 EF52 v6D MOS56 0156 EF5F ; (KEY VALUES START AT 16 IN THIS RTNE) MOS56 0145 EF52 v6D MOS56 0157 EF5F ; ALSO SET COUNTER TO 1 MOS56 0145 EF52 v6D MOS56 0158 EF5F ; indicate no current key MOS56 0145 EF52 v6D MOS56 0159 EF5F A2 00 LDXIM ZERO MOS56 0145 EF52 v6D MOS56 0160 EF61 86 EC STX CKEY MOS56 0145 EF52 v6D MOS56 0161 EF63 FCSP ;fix to CTRL/SHIFT h/w problem MOS56 0145 EF52 v6D MOS56 0162 EF63 20 2E F0 JSR AR ;update auto-repeat intervals MOS56 0267 EFBB ^26 MOS56 0163 EF66 KBDWU MOS56 0267 EFBB ^26 MOS56 0164 EF66 4C F8 EF JMP KBDY MOS56 0267 EFBB ^26 MOS56 0165 EF69 KBDX ;current KEY IS CLOSED:IF WAS OPEN,SIMPLY MOS56 0267 EFBB ^26 MOS56 0166 EF69 ; UPDATE STATUS,ELSE CHECK COUNTER MOS56 0267 EFBB ^26 MOS56 0167 EF69 ; AND PROCESS CHAR IF REQ'D. MOS56 0267 EFBB ^26 MOS56 0168 EF69 E4 EC CPX CKEY MOS56 0267 EFBB ^26 MOS56 0169 EF6B D0 EE BNE KBDW ;[current key: is closed, was open] MOS56 0267 EFBB ^26 MOS56 0170 EF6D ; current key is closed and was closed MOS56 0267 EFBB ^26 MOS56 0171 EF6D A5 E7 LDA ARCTR MOS56 0267 EFBB ^26 MOS56 0172 EF6F F0 23 BEQ KBDXS ;[auto-repeat suppressed] MOS56 0267 EFBB ^26 MOS56 0173 EF71 ; decrement auto-repeat countdown MOS56 0267 EFBB ^26 MOS56 0174 EF71 C6 E7 DEC ARCTR MOS56 0267 EFBB ^26 MOS56 0175 EF73 D0 1F BNE KBDXS ;[auto-repeat interval not exhausted] MOS56 0267 EFBB ^26 MOS56 0176 EF75 ; auto-repeat interval exhausted MOS56 0267 EFBB ^26 MOS56 0177 EF75 ; auto-repeat countdown := delay/repeat period MOS56 0267 EFBB ^26 MOS56 0178 EF75 AD CA 02 LDA FARCTR MOS56 0267 EFBB ^26 MOS56 0179 EF78 85 E7 STA ARCTR MOS56 0267 EFBB ^26 MOS56 0180 EF7A ; next auto-repeat interval := repeat period MOS56 0267 EFBB ^26 MOS56 0181 EF7A AD 55 02 LDA ARSET MOS56 0267 EFBB ^26 MOS56 0182 EF7D 8D CA 02 STA FARCTR MOS56 0267 EFBB ^26 MOS56 0183 EF80 ; MOS56 0267 EFBB ^26 MOS56 0184 EF80 AD 5A 02 LDA KSTAT MOS56 0267 EFBB ^26 MOS56 0185 EF83 ; test for shift lock key MOS56 0267 EFBB ^26 MOS56 0186 EF83 A6 EC LDX CKEY MOS56 0267 EFBB ^26 MOS56 0187 EF85 E0 D0 CPXIM SHLKKY ;IS THIS THE SHIFT LOCK? MOS56 0267 EFBB ^26 MOS56 0188 EF87 D0 0D BNE KCPLK ;[key is not SHIFT lock] MOS56 0267 EFBB ^26 MOS56 0189 EF89 ; MOS56 0267 EFBB ^26 MOS56 0190 EF89 ; SHIFT LOCK key processing MOS56 0267 EFBB ^26 MOS56 0191 EF89 09 90 ORAIM CAPSL+INVERT ;clear CAPITALS lock state MOS56 0267 EFBB ^26 MOS56 0192 EF8B 49 A0 EORIM SHFTL+INVERT ;flip SHIFT lock state and clear invert MOS56 0267 EFBB ^26 MOS56 0193 EF8D KEYBD3 ;update keyboard status MOS56 0267 EFBB ^26 MOS56 0194 EF8D 8D 5A 02 STA KSTAT ;store SHIFT lock state MOS56 0267 EFBB ^26 MOS56 0195 EF90 ; suppress auto-repeat MOS56 0267 EFBB ^26 MOS56 0196 EF90 A9 00 LDAIM ZERO MOS56 0267 EFBB ^26 MOS56 0197 EF92 85 E7 STA ARCTR MOS56 0267 EFBB ^26 MOS56 0198 EF94 KBDXS MOS56 0267 EFBB ^26 MOS56 0199 EF94 [ MOS125 = &FF MOS56 0267 EFBB ^26 MOS56 0201 EF94 | MOS56 0267 EFBB ^26 MOS56 0202 EF94 B0 62 BCS KBDY ;always branch MOS56 0202 EF94 v1D MOS56 0203 EF96 ] MOS56 0202 EF94 v1D MOS56 0204 EF96 MOS56 0202 EF94 v1D MOS56 0205 EF96 KCPLK ;CAPS key processing MOS56 0202 EF94 v1D MOS56 0206 EF96 E0 C0 CPXIM CPLKKY MOS56 0202 EF94 v1D MOS56 0207 EF98 D0 0E BNE KCPLK1 ;[not CAPITALS lock] MOS56 0202 EF94 v1D MOS56 0208 EF9A ; clear SHIFT lock state MOS56 0202 EF94 v1D MOS56 0209 EF9A 09 A0 ORAIM SHFTL+INVERT MOS56 0202 EF94 v1D MOS56 0210 EF9C ; add in SHIFT invert status MOS56 0202 EF94 v1D MOS56 0211 EF9C 24 FA BIT KTEMP MOS56 0202 EF94 v1D MOS56 0212 EF9E 10 04 BPL KCPLK2 ;[not SHIFT/CAPS] MOS56 0202 EF94 v1D MOS56 0213 EFA0 ; SHIFT/CAPS - force CAPS invert MOS56 0202 EF94 v1D MOS56 0214 EFA0 09 10 ORAIM CAPSL MOS56 0202 EF94 v1D MOS56 0215 EFA2 49 80 EORIM INVERT MOS56 0202 EF94 v1D MOS56 0216 EFA4 KCPLK2 MOS56 0202 EF94 v1D MOS56 0217 EFA4 ; flip CAPITALS lock state MOS56 0202 EF94 v1D MOS56 0218 EFA4 49 90 EORIM CAPSL+INVERT MOS56 0202 EF94 v1D MOS56 0219 EFA6 ; set CAPITALS lock state and disable auto-repeat MOS56 0202 EF94 v1D MOS56 0220 EFA6 [ MOS125 = &FF MOS56 0202 EF94 v1D MOS56 0222 EFA6 | MOS56 0202 EF94 v1D MOS56 0223 EFA6 B0 E5 BCS KEYBD3 ;C=1 from CPXIM MOS56 0202 EF94 v1D MOS56 0224 EFA8 ] MOS56 0202 EF94 v1D MOS56 0225 EFA8 MOS56 0202 EF94 v1D MOS56 0226 EFA8 KCPLK1 MOS56 0202 EF94 v1D MOS56 0227 EFA8 ; AT THIS POINT, WE HAVE A CHARACTER FOR RDCH MOS56 0202 EF94 v1D MOS56 0228 EFA8 ; NOW LOOK UP CODE AND MODIFY BY SHIFT MOS56 0202 EF94 v1D MOS56 0229 EFA8 ; CONTROL OR CAPS LOCK AS APPROPRIATE MOS56 0202 EF94 v1D MOS56 0230 EFA8 ; convert current key code to ASCII MOS56 0202 EF94 v1D MOS56 0231 EFA8 BD BA EF LDAAX KTBL -&80 MOS56 0202 EF94 v1D MOS56 0232 EFAB D0 03 BNE NTAB ;[not TAB key] MOS56 0202 EF94 v1D MOS56 0233 EFAD ; TAB key MOS56 0202 EF94 v1D MOS56 0234 EFAD AD 6B 02 LDA TABCOD MOS56 0202 EF94 v1D MOS56 0235 EFB0 NTAB MOS56 0202 EF94 v1D MOS56 0236 EFB0 MOS56 0202 EF94 v1D MOS56 0237 EFB0 [ FALSE=0 MOS56 0202 EF94 v1D MOS56 0256 EFB0 ] MOS56 0202 EF94 v1D MOS56 0257 EFB0 MOS56 0202 EF94 v1D MOS56 0258 EFB0 ; setup for KSTAT tests MOS56 0202 EF94 v1D MOS56 0259 EFB0 AE 5A 02 LDX KSTAT MOS56 0202 EF94 v1D MOS56 0260 EFB3 86 FA STX KTEMP MOS56 0202 EF94 v1D MOS56 0261 EFB5 ; check for CTRL MOS56 0202 EF94 v1D MOS56 0262 EFB5 26 FA ROL KTEMP MOS56 0202 EF94 v1D MOS56 0263 EFB7 10 07 BPL KCONV6 ;[no CTRL] MOS56 0202 EF94 v1D MOS56 0264 EFB9 ; cannot support two-key rollover with CTRL (h/w constraint) MOS56 0202 EF94 v1D MOS56 0265 EFB9 A6 ED LDX OKEY MOS56 0202 EF94 v1D MOS56 0266 EFBB FCSP1 ;chained branch MOS56 0202 EF94 v1D MOS56 0267 EFBB D0 A6 BNE FCSP ;[at least two keys pressed] MOS56 0202 EF94 v1D MOS56 0268 EFBD ; convert character to associated control character MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 118 MOS56 MOS56 Keyboard management MOS56 MOS56 0202 EF94 v1D MOS56 0269 EFBD 20 0B EB JSR CTRLCH MOS56 0202 EF94 v1D MOS56 0270 EFC0 KCONV6 MOS56 0202 EF94 v1D MOS56 0271 EFC0 ; check for SHIFT lock MOS56 0202 EF94 v1D MOS56 0272 EFC0 [ MOS125 = &FF MOS56 0202 EF94 v1D MOS56 0290 EFC0 | MOS56 0202 EF94 v1D MOS56 0291 EFC0 26 FA ROL KTEMP MOS56 0202 EF94 v1D MOS56 0292 EFC2 26 FA ROL KTEMP ;skip over CAPITALS lock state MOS56 0202 EF94 v1D MOS56 0293 EFC4 90 07 BCC KCONV4 ;[SHIFT lock] MOS56 0202 EF94 v1D MOS56 0294 EFC6 ; check for CAPS lock MOS56 0202 EF94 v1D MOS56 0295 EFC6 30 0D BMI KCONV2 ;[no CAPS lock or SHIFT lock] MOS56 0202 EF94 v1D MOS56 0296 EFC8 ; convert character to upper case MOS56 0202 EF94 v1D MOS56 0297 EFC8 ; check for character in the range 'A' to 'Z' or 'a' to 'z' MOS56 0202 EF94 v1D MOS56 0298 EFC8 20 27 E5 JSR CAPS MOS56 0202 EF94 v1D MOS56 0299 EFCB B0 08 BCS KCONV2 ;[not alpha] MOS56 0202 EF94 v1D MOS56 0300 EFCD ; character is an alpha MOS56 0202 EF94 v1D MOS56 0301 EFCD KCONV4 MOS56 0202 EF94 v1D MOS56 0302 EFCD 20 E8 EA JSR SHIFT ;invert case of alpha MOS56 0202 EF94 v1D MOS56 0303 EFD0 ] MOS56 0202 EF94 v1D MOS56 0304 EFD0 ; check for shift disabled MOS56 0202 EF94 v1D MOS56 0305 EFD0 AE 5A 02 LDX KSTAT MOS56 0202 EF94 v1D MOS56 0306 EFD3 10 0B BPL KCONV1 ;[shift disabled] MOS56 0202 EF94 v1D MOS56 0307 EFD5 KCONV2 ;check for SHIFT MOS56 0202 EF94 v1D MOS56 0308 EFD5 26 FA ROL KTEMP MOS56 0202 EF94 v1D MOS56 0309 EFD7 10 07 BPL KCONV1 ;[no SHIFT] MOS56 0202 EF94 v1D MOS56 0310 EFD9 ; cannot support two-key rollover with SHIFT (h/w constraint) MOS56 0202 EF94 v1D MOS56 0311 EFD9 A6 ED LDX OKEY MOS56 0202 EF94 v1D MOS56 0312 EFDB D0 DE BNE FCSP1 ;[at least two keys pressed] MOS56 0202 EF94 v1D MOS56 0313 EFDD ; shift character MOS56 0202 EF94 v1D MOS56 0314 EFDD 20 E8 EA JSR SHIFT MOS56 0202 EF94 v1D MOS56 0315 EFE0 KCONV1 MOS56 0202 EF94 v1D MOS56 0316 EFE0 ; MOS56 0202 EF94 v1D MOS56 0317 EFE0 ; check for interrupt character MOS56 0202 EF94 v1D MOS56 0318 EFE0 ; MOS56 0202 EF94 v1D MOS56 0319 EFE0 CD 6C 02 CMP INTCH MOS56 0202 EF94 v1D MOS56 0320 EFE3 D0 07 BNE KESC1 ;[not interrupt character] MOS56 0202 EF94 v1D MOS56 0321 EFE5 AE 75 02 LDX ESCHAR MOS56 0202 EF94 v1D MOS56 0322 EFE8 D0 02 BNE KESC1 ;[treat as normal character] MOS56 0202 EF94 v1D MOS56 0323 EFEA ; MOS56 0202 EF94 v1D MOS56 0324 EFEA ; X=0, Z=1 MOS56 0202 EF94 v1D MOS56 0325 EFEA ; MOS56 0202 EF94 v1D MOS56 0326 EFEA 86 E7 STX ARCTR ;suppress auto-repeat for escape if escape condition enabled MOS56 0202 EF94 v1D MOS56 0327 EFEC KESC1 MOS56 0202 EF94 v1D MOS56 0328 EFEC ; MOS56 0202 EF94 v1D MOS56 0329 EFEC ; allow interrupts MOS56 0202 EF94 v1D MOS56 0330 EFEC ; MOS56 0202 EF94 v1D MOS56 0331 EFEC A8 TAY ;Y := character (will be passed to RDCHS) MOS56 0202 EF94 v1D MOS56 0332 EFED 20 35 F1 JSR KALLOW MOS56 0202 EF94 v1D MOS56 0333 EFF0 ; MOS56 0202 EF94 v1D MOS56 0334 EFF0 ; insert character into RDCH buffer MOS56 0202 EF94 v1D MOS56 0335 EFF0 ; MOS56 0202 EF94 v1D MOS56 0336 EFF0 AD 59 02 LDA NETKDS MOS56 0202 EF94 v1D MOS56 0337 EFF3 D0 03 BNE KBDY ;[keyboard disabled] MOS56 0202 EF94 v1D MOS56 0338 EFF5 20 34 E5 JSR RDCHS MOS56 0202 EF94 v1D MOS56 0339 EFF8 ; MOS56 0202 EF94 v1D MOS56 0340 EFF8 KBDY ; NOW WE EVALUATE THE OLD KEY STATUS. MOS56 0202 EF94 v1D MOS56 0341 EFF8 ; IF OPEN FOR 2 CLOCK CYCLES, FORGET IT MOS56 0202 EF94 v1D MOS56 0342 EFF8 ; OTHERWISE, SIMPLY MEMORISE IT! MOS56 0202 EF94 v1D MOS56 0343 EFF8 A6 ED LDX OKEY -- MOS56 0344 EFFA F0 0B BEQ KBDA ;[old key does not exist] MOS56 0344 EFFA v74 MOS56 0345 EFFC ; MOS56 0344 EFFA v74 MOS56 0346 EFFC ; old key exists MOS56 0344 EFFA v74 MOS56 0347 EFFC 20 39 F0 JSR KC MOS56 0344 EFFA v74 MOS56 0348 EFFF 86 ED STX OKEY ;remember old key state MOS56 0344 EFFA v74 MOS56 0349 F001 30 04 BMI KBDA ;[old key closed] MOS56 0344 EFFA v74 MOS56 0350 F003 ; MOS56 0344 EFFA v74 MOS56 0351 F003 ; old key open MOS56 0344 EFFA v74 MOS56 0352 F003 [ FALSE=0 MOS56 0344 EFFA v74 MOS56 0356 F003 ] MOS56 0344 EFFA v74 MOS56 0357 F003 ; MOS56 0344 EFFA v74 MOS56 0358 F003 ; old key: is open, was open MOS56 0344 EFFA v74 MOS56 0359 F003 A2 00 LDXIM ZERO MOS56 0344 EFFA v74 MOS56 0360 F005 86 ED STX OKEY ;indicate no old key MOS56 0344 EFFA v74 MOS56 0361 F007 KBDA ; NOW CHECK TO SEE IF A SCAN IS NEEDED. MOS56 0344 EFFA v74 MOS56 0362 F007 ; IF OLD KEY ZERO, DO SCAN. IF KEY DOWN & MOS56 0344 EFFA v74 MOS56 0363 F007 ; NOT EQUAL CKEY THEN SET OLD=CURRENT, & THIS MOS56 0344 EFFA v74 MOS56 0364 F007 ; ONE = CURRENT, RESET STATUS CHANGE BITS MOS56 0344 EFFA v74 MOS56 0365 F007 A6 ED LDX OKEY -- MOS56 0366 F009 D0 16 BNE KBDAU ;[old key exists] MOS56 0366 F009 v69 MOS56 0367 F00B ; no old key so scan keyboard MOS56 0366 F009 v69 MOS56 0368 F00B A0 EC LDYIM CKEY MOS56 0366 F009 v69 MOS56 0369 F00D 20 D8 F0 JSR ISCAN MOS56 0366 F009 v69 MOS56 0370 F010 30 09 BMI KBDAS ;[all keys searched] MOS56 0366 F009 v69 MOS56 0371 F012 ; closed key found other than current key MOS56 0366 F009 v69 MOS56 0372 F012 ; new current key found MOS56 0366 F009 v69 MOS56 0373 F012 ; set old key = current key MOS56 0366 F009 v69 MOS56 0374 F012 A5 EC LDA CKEY MOS56 0366 F009 v69 MOS56 0375 F014 85 ED STA OKEY MOS56 0366 F009 v69 MOS56 0376 F016 KBDAR ;set new current key MOS56 0366 F009 v69 MOS56 0377 F016 86 EC STX CKEY ;current key := new key number MOS56 0394 F02C ^68 MOS56 0378 F018 20 2E F0 JSR AR ;update auto-repeat intervals MOS56 0394 F02C ^68 MOS56 0379 F01B 4C F3 EE KBDAS JMP KBDAW MOS56 0394 F02C ^68 MOS56 0380 F01E KBDAT MOS56 0394 F02C ^68 MOS56 0381 F01E ; ENTRY POINT FROM ANY KEY MOS56 0394 F02C ^68 MOS56 0382 F01E ; DOWN INTERRUPT MOS56 0394 F02C ^68 MOS56 0383 F01E ; enable keyboard by scanning random key (X) MOS56 0394 F02C ^68 MOS56 0384 F01E 20 39 F0 JSR KC MOS56 0394 F02C ^68 MOS56 0385 F021 KBDAU ;find new current key MOS56 0394 F02C ^68 MOS56 0386 F021 A5 EC LDA CKEY MOS56 0394 F02C ^68 MOS56 0387 F023 D0 F6 BNE KBDAS ;[current key exists, should only exist during power up] MOS56 0394 F02C ^68 MOS56 0388 F025 ; scan keyboard matrix entries MOS56 0394 F02C ^68 MOS56 0389 F025 A0 ED LDYIM OKEY MOS56 0394 F02C ^68 MOS56 0390 F027 20 D8 F0 JSR ISCAN MOS56 0394 F02C ^68 MOS56 0391 F02A 30 EF BMI KBDAS ;[processed all keys] MOS56 0394 F02C ^68 MOS56 0392 F02C ; pressed key found other than old key MOS56 0394 F02C ^68 MOS56 0393 F02C ; new current key identified MOS56 0394 F02C ^68 MOS56 0394 F02C 10 E8 BPL KBDAR ;[ALWAYS JUMP] -- MOS56 0395 F02E ; NEVER fall thru -- MOS56 0396 F02E -- MOS56 0397 F02E -- MOS56 0398 F02E AR ;set auto-repeat interval to reflect next character -- MOS56 0399 F02E A2 01 LDXIM &01 -- MOS56 0400 F030 86 E7 STX ARCTR -- MOS56 0401 F032 ; set next auto-repeat interval to delay period -- MOS56 0402 F032 AE 54 02 LDX FARSET -- MOS56 0403 F035 8E CA 02 STX FARCTR -- MOS56 0404 F038 60 RTS -- MOS56 0405 F039 -- MOS56 0406 F039 -- MOS56 0407 F039 [ FALSE=0 -- MOS56 0414 F039 ] -- MOS56 0415 F039 MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 119 MOS56 MOS56 Keyboard management MOS56 -- MOS56 0416 F039 KC -- MOS56 0417 F039 ; KEYBOARD ACCESS SUBROUTINE -- MOS56 0418 F039 ; read state of key -- MOS56 0419 F039 ; X = 0rrrcccc -- MOS56 0420 F039 ; r = row, c = column -- MOS56 0421 F039 ; N.B. A and C not corrupted -- MOS56 0422 F039 [ 1=0 ;$Tutu -- MOS56 0434 F039 | -- MOS56 0435 F039 ; enable keyboard -- MOS56 0436 F039 A0 03 LDYIM &03 -- MOS56 0437 F03B 8C 40 FE STY PBQ -- MOS56 0438 F03E ; select VIAA PA6-PA0 as outputs -- MOS56 0439 F03E A0 7F LDYIM &7F -- MOS56 0440 F040 8C 43 FE STY DDRAQ -- MOS56 0441 F043 8E 4F FE STX PAPQ ;select matrix element -- MOS56 0442 F046 AE 4F FE LDX PAPQ ;read element status: N=0 => open, N=1 => closed -- MOS56 0443 F049 60 RTS -- MOS56 0444 F04A ] -- MOS56 0445 F04A -- MOS56 0446 F04A -- MOS56 0447 F04A -- MOS56 0448 F04A -- MOS56 0449 F04A ; KEY CONVERSION TABLE -- MOS56 0450 F04A ; ROW 0 -- MOS56 0451 F04A ; not relevant -- MOS56 0452 F04A ; (consists of SHIFT, CTRL and start-up options) -- MOS56 0453 F04A KTBL0 -- MOS56 0454 F04A F03A KTBL * KTBL0 -&10 -- MOS56 0455 F04A ; ROW 1 -- MOS56 0456 F04A 71 = "q" -- MOS56 0457 F04B 33 = "3" ;shift '#' -- MOS56 0458 F04C 34 = "4" ;shift '$' -- MOS56 0459 F04D 35 = "5" ;shift '%' -- MOS56 0460 F04E 84 = SOFTK4 ;f4 -- MOS56 0461 F04F 38 = "8" ;shift '(' -- MOS56 0462 F050 87 = SOFTK7 ;f7 -- MOS56 0463 F051 2D = "-" ;shift '=' -- MOS56 0464 F052 5E = "^" ;shift '~' -- MOS56 0465 F053 8C = CURLFT ;cursor left (fC) -- MOS56 0466 F054 -- MOS56 0467 F054 ; 'hide' 6 bytes -- MOS56 0468 F054 [ MOS125 = &FF -- MOS56 0474 F054 | -- MOS56 0475 F054 PUTCHK -- MOS56 0476 F054 -- MOS56 0477 F054 ;Output byte to cassette and add to check sum. -- MOS56 0478 F054 -- MOS56 0479 F054 20 A7 F8 JSR PUTCAS -- MOS56 0480 F057 4C E0 F7 JMP ADDCRC -- MOS56 0481 F05A ] -- MOS56 0482 F05A -- MOS56 0483 F05A ; ROW 2 -- MOS56 0484 F05A 80 = SOFTK0 ;f0 -- MOS56 0485 F05B 77 = "w" -- MOS56 0486 F05C 65 = "e" -- MOS56 0487 F05D 74 = "t" -- MOS56 0488 F05E 37 = "7" ;shift single quote -- MOS56 0489 F05F 69 = "i" -- MOS56 0490 F060 39 = "9" ;shift ')' -- MOS56 0491 F061 30 = "0" ;same shifted -- MOS56 0492 F062 POUNDM -- MOS56 0493 F062 5F = "_" ;shift POUND -- MOS56 0494 F063 8E = CURDWN ;cursor down (fE) -- MOS56 0495 F064 -- MOS56 0496 F064 ; 'hide' 6 bytes -- MOS56 0497 F064 6C FE FD JMITST JMI TSTSFT -- MOS56 0498 F067 [ MOS125 = &FF -- MOS56 0500 F067 | -- MOS56 0501 F067 6C 20 02 JMIEVT JMI EVTVEC ;user event -- MOS56 0502 F06A ] -- MOS56 0503 F06A -- MOS56 0504 F06A ; ROW 3 -- MOS56 0505 F06A 31 = "1" ;shift '!' -- MOS56 0506 F06B 32 = "2" ;shift double quote -- MOS56 0507 F06C 64 = "d" -- MOS56 0508 F06D 72 = "r" -- MOS56 0509 F06E 36 = "6" ;shift '&' -- MOS56 0510 F06F 75 = "u" -- MOS56 0511 F070 6F = "o" -- MOS56 0512 F071 70 = "p" -- MOS56 0513 F072 5B = "[" ;shift curly left bracket -- MOS56 0514 F073 8F = CURUP ;cursor up (fF) -- MOS56 0515 F074 -- MOS56 0516 F074 ; 'hide' 6 bytes -- MOS56 0517 F074 2C 49 D9 JMIKYV BIT FFBYT -- MOS56 0518 F077 6C 28 02 JMIKEY JMI KEYVEC MOS56 0658 F0DB ^1A MOS56 0519 F07A MOS56 0658 F0DB ^1A MOS56 0520 F07A ; ROW 4 MOS56 0658 F0DB ^1A MOS56 0521 F07A 01 = &01 ;CAPS lock MOS56 0658 F0DB ^1A MOS56 0522 F07B 61 = "a" MOS56 0658 F0DB ^1A MOS56 0523 F07C 78 = "x" MOS56 0658 F0DB ^1A MOS56 0524 F07D 66 = "f" MOS56 0658 F0DB ^1A MOS56 0525 F07E 79 = "y" MOS56 0658 F0DB ^1A MOS56 0526 F07F 6A = "j" MOS56 0658 F0DB ^1A MOS56 0527 F080 6B = "k" MOS56 0658 F0DB ^1A MOS56 0528 F081 40 = AT ;same shifted MOS56 0658 F0DB ^1A MOS56 0529 F082 3A = ":" ;shift '*' MOS56 0658 F0DB ^1A MOS56 0530 F083 0D = MCR ;same shifted MOS56 0658 F0DB ^1A MOS56 0531 F084 MOS56 0658 F0DB ^1A MOS56 0532 F084 [ NOSP = &00 MOS56 0658 F0DB ^1A MOS56 0542 F084 | MOS56 0658 F0DB ^1A MOS56 0543 F084 ; 'hide' 6 bytes MOS56 0658 F0DB ^1A MOS56 0544 F084 SENDD MOS56 0658 F0DB ^1A MOS56 0545 F084 00 = &00 ;inputs MOS56 0658 F0DB ^1A MOS56 0546 F085 FF = &FF ;outputs MOS56 0658 F0DB ^1A MOS56 0547 F086 SENDS MOS56 0658 F0DB ^1A MOS56 0548 F086 01 = &01 ;read enable MOS56 0658 F0DB ^1A MOS56 0549 F087 02 = &02 ;write enable MOS56 0658 F0DB ^1A MOS56 0550 F088 SENDF MOS56 0658 F0DB ^1A MOS56 0551 F088 09 = &09 ;read disable MOS56 0658 F0DB ^1A MOS56 0552 F089 0A = &0A ;write disable MOS56 0658 F0DB ^1A MOS56 0553 F08A ] MOS56 0658 F0DB ^1A MOS56 0554 F08A MOS56 0658 F0DB ^1A MOS56 0555 F08A ; ROW 5 MOS56 0658 F0DB ^1A MOS56 0556 F08A 02 = &02 ;SHIFT lock MOS56 0658 F0DB ^1A MOS56 0557 F08B 73 = "s" MOS56 0658 F0DB ^1A MOS56 0558 F08C 63 = "c" MOS56 0658 F0DB ^1A MOS56 0559 F08D 67 = "g" MOS56 0658 F0DB ^1A MOS56 0560 F08E 68 = "h" MOS56 0658 F0DB ^1A MOS56 0561 F08F 6E = "n" MOS56 0658 F0DB ^1A MOS56 0562 F090 6C = "l" MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 120 MOS56 MOS56 Keyboard management MOS56 MOS56 0658 F0DB ^1A MOS56 0563 F091 3B = ";" ;shift '+' MOS56 0658 F0DB ^1A MOS56 0564 F092 5D = "]" ;shift curly right bracket MOS56 0658 F0DB ^1A MOS56 0565 F093 7F = MDEL ;same shifted MOS56 0658 F0DB ^1A MOS56 0566 F094 MOS56 0658 F0DB ^1A MOS56 0567 F094 ; 'hide' 6 bytes MOS56 0658 F0DB ^1A MOS56 0568 F094 RMLA ;read machine low memory address MOS56 0658 F0DB ^1A MOS56 0569 F094 AC 44 02 LDY HWM MOS56 0658 F0DB ^1A MOS56 0570 F097 A2 00 LDXIM ZERO MOS56 0658 F0DB ^1A MOS56 0571 F099 60 RTS MOS56 0658 F0DB ^1A MOS56 0572 F09A MOS56 0658 F0DB ^1A MOS56 0573 F09A ; ROW 6 MOS56 0658 F0DB ^1A MOS56 0574 F09A 00 = ZERO ;TAB - programmable TAB key MOS56 0658 F0DB ^1A MOS56 0575 F09B 7A = "z" MOS56 0658 F0DB ^1A MOS56 0576 F09C 20 = SPACE ;same shifted MOS56 0658 F0DB ^1A MOS56 0577 F09D 76 = "v" MOS56 0658 F0DB ^1A MOS56 0578 F09E 62 = "b" MOS56 0658 F0DB ^1A MOS56 0579 F09F 6D = "m" MOS56 0658 F0DB ^1A MOS56 0580 F0A0 2C = "," ;shift '<' MOS56 0658 F0DB ^1A MOS56 0581 F0A1 2E = "." ;shift '>' MOS56 0658 F0DB ^1A MOS56 0582 F0A2 2F = "/" ; shift '?' MOS56 0658 F0DB ^1A MOS56 0583 F0A3 8B = MCOPY ;copy character at cursor (fB) MOS56 0658 F0DB ^1A MOS56 0584 F0A4 MOS56 0658 F0DB ^1A MOS56 0585 F0A4 ; 'hide' 6 bytes MOS56 0658 F0DB ^1A MOS56 0586 F0A4 JFLUSH ;flush input buffer and clear soft key expansion MOS56 0658 F0DB ^1A MOS56 0587 F0A4 AE 41 02 LDX RDCHSW ;X := input bufferid MOS56 0658 F0DB ^1A MOS56 0588 F0A7 FLUSH2 MOS56 0658 F0DB ^1A MOS56 0589 F0A7 4C FD E1 JMP PURGE ;purge buffer AND return MOS56 0658 F0DB ^1A MOS56 0590 F0AA MOS56 0658 F0DB ^1A MOS56 0591 F0AA ; ROW 7 MOS56 0658 F0DB ^1A MOS56 0592 F0AA 1B = ESC ;same shifted MOS56 0658 F0DB ^1A MOS56 0593 F0AB 81 = SOFTK1 ;f1 MOS56 0658 F0DB ^1A MOS56 0594 F0AC 82 = SOFTK2 ;f2 MOS56 0658 F0DB ^1A MOS56 0595 F0AD 83 = SOFTK3 ;f3 MOS56 0658 F0DB ^1A MOS56 0596 F0AE 85 = SOFTK5 ;f5 MOS56 0658 F0DB ^1A MOS56 0597 F0AF 86 = SOFTK6 ;f6 MOS56 0658 F0DB ^1A MOS56 0598 F0B0 88 = SOFTK8 ;f8 MOS56 0658 F0DB ^1A MOS56 0599 F0B1 89 = SOFTK9 ;f9 MOS56 0658 F0DB ^1A MOS56 0600 F0B2 5C = "\" ;shift '|' MOS56 0658 F0DB ^1A MOS56 0601 F0B3 8D = CURRHT ;cursor right (fD) MOS56 0658 F0DB ^1A MOS56 0602 F0B4 ENDKT MOS56 0658 F0DB ^1A MOS56 0603 F0B4 MOS56 0658 F0DB ^1A MOS56 0604 F0B4 MOS56 0658 F0DB ^1A MOS56 0605 F0B4 [ MOS125 = &FF MOS56 0658 F0DB ^1A MOS56 0607 F0B4 ] MOS56 0658 F0DB ^1A MOS56 0608 F0B4 MOS56 0658 F0DB ^1A MOS56 0609 F0B4 MOS56 0658 F0DB ^1A MOS56 0610 F0B4 FLUSHC ;flush buffer MOS56 0658 F0DB ^1A MOS56 0611 F0B4 D0 EE BNE JFLUSH ;[flush currently selected input buffer] MOS56 0658 F0DB ^1A MOS56 0612 F0B6 ; X=0 => flush all buffers MOS56 0658 F0DB ^1A MOS56 0613 F0B6 FLSHAL ;flush all buffers MOS56 0658 F0DB ^1A MOS56 0614 F0B6 A2 08 LDXIM BUPB MOS56 0658 F0DB ^1A MOS56 0615 F0B8 FLUSH3 MOS56 0658 F0DB ^1A MOS56 0616 F0B8 ; allow interrupts MOS56 0658 F0DB ^1A MOS56 0617 F0B8 58 CLI MOS56 0658 F0DB ^1A MOS56 0618 F0B9 78 SEI MOS56 0658 F0DB ^1A MOS56 0619 F0BA 20 C0 F0 JSR FLUSHS ;flush buffer given by X MOS56 0658 F0DB ^1A MOS56 0620 F0BD CA DEX MOS56 0658 F0DB ^1A MOS56 0621 F0BE 10 F8 BPL FLUSH3 MOS56 0658 F0DB ^1A MOS56 0622 F0C0 ; MOS56 0658 F0DB ^1A MOS56 0623 F0C0 ; N.B. X<0, so is an invalid bufferid (and will be ignored by FLUSHS) MOS56 0658 F0DB ^1A MOS56 0624 F0C0 ; MOS56 0658 F0DB ^1A MOS56 0625 F0C0 FLUSHS ;flush specific buffer MOS56 0658 F0DB ^1A MOS56 0626 F0C0 E0 09 CPXIM BUPB +&01 MOS56 0658 F0DB ^1A MOS56 0627 F0C2 90 E3 BCC FLUSH2 ;[valid bufferid] MOS56 0658 F0DB ^1A MOS56 0628 F0C4 ; invalid bufferid MOS56 0658 F0DB ^1A MOS56 0629 F0C4 60 RTS MOS56 0658 F0DB ^1A MOS56 0630 F0C5 MOS56 0658 F0DB ^1A MOS56 0631 F0C5 MOS56 0658 F0DB ^1A MOS56 0632 F0C5 HELP ;*HELP command MOS56 0658 F0DB ^1A MOS56 0633 F0C5 A2 09 LDXIM SVHELP MOS56 0658 F0DB ^1A MOS56 0634 F0C7 20 74 F1 JSR SVOP ;Y = offset within line of arguments MOS56 0658 F0DB ^1A MOS56 0635 F0CA ; MOS56 0658 F0DB ^1A MOS56 0636 F0CA ; Y preserved, therefore Y>=2 on return MOS56 0658 F0DB ^1A MOS56 0637 F0CA ; MOS56 0658 F0DB ^1A MOS56 0638 F0CA 20 3D FA JSR STROUT ;needs Y<>0 to print MOS56 0658 F0DB ^1A MOS56 0639 F0CD 0D = MCR MOS56 0658 F0DB ^1A MOS56 0640 F0CE 4F 53 20 = "OS " MOS56 0658 F0DB ^1A MOS56 0641 F0D1 31 = VERA MOS56 0658 F0DB ^1A MOS56 0642 F0D2 2E = "." MOS56 0658 F0DB ^1A MOS56 0643 F0D3 32 = VERB MOS56 0658 F0DB ^1A MOS56 0644 F0D4 36 = VERC MOS56 0658 F0DB ^1A MOS56 0645 F0D5 0D = MCR MOS56 0658 F0DB ^1A MOS56 0646 F0D6 00 = ZERO MOS56 0658 F0DB ^1A MOS56 0647 F0D7 ; MOS56 0658 F0DB ^1A MOS56 0648 F0D7 60 RTS MOS56 0658 F0DB ^1A MOS56 0649 F0D8 MOS56 0658 F0DB ^1A MOS56 0650 F0D8 MOS56 0658 F0DB ^1A MOS56 0651 F0D8 ISCAN ;scan keys from matrix address $10 MOS56 0658 F0DB ^1A MOS56 0652 F0D8 18 CLC ;ignore key addressed by Y MOS56 0658 F0DB ^1A MOS56 0653 F0D9 ; MOS56 0658 F0DB ^1A MOS56 0654 F0D9 XSCANA ;FX entry, scan keys from matrix address $10, C=1 (ignore no keys) MOS56 0658 F0DB ^1A MOS56 0655 F0D9 A2 10 LDXIM &10 MOS56 0658 F0DB ^1A MOS56 0656 F0DB ; MOS56 0658 F0DB ^1A MOS56 0657 F0DB XSCANB ;FX entry, scan keys from matrix address X, C=1 (ignore no keys) MOS56 0658 F0DB ^1A MOS56 0658 F0DB B0 9A BCS JMIKEY ;[route FX entries thru indirection] -- MOS56 0659 F0DD ; -- MOS56 0660 F0DD SKFMA ;scan keys from matrix address (should have C=1) -- MOS56 0661 F0DD ; start scan address in X -- MOS56 0662 F0DD ; X>=0 => scan keys starting at X -- MOS56 0663 F0DD ; X<0 => investigate key NOT(X) -- MOS56 0664 F0DD ; -- MOS56 0665 F0DD 8A TXA -- MOS56 0666 F0DE 10 05 BPL SKFMA2 ;[scan keys] MOS56 0666 F0DE v7A MOS56 0667 F0E0 ; C=1 MOS56 0666 F0DE v7A MOS56 0668 F0E0 ; look at key MOS56 0666 F0DE v7A MOS56 0669 F0E0 ; MOS56 0666 F0DE v7A MOS56 0670 F0E0 20 39 F0 JSR KC ;result in top bit of X (N.B. does not alter C) MOS56 0666 F0DE v7A MOS56 0671 F0E3 ; C=1 MOS56 0666 F0DE v7A MOS56 0672 F0E3 B0 55 BCS KALLOX ;return result in A MOS56 0672 F0E3 v2A MOS56 0673 F0E5 ; MOS56 0672 F0E3 v2A MOS56 0674 F0E5 SKFMA2 MOS56 0672 F0E3 v2A MOS56 0675 F0E5 ; MOS56 0672 F0E3 v2A MOS56 0676 F0E5 08 PHP ;save request source indicator (in C) MOS56 0672 F0E3 v2A MOS56 0677 F0E6 90 02 BCC SKFMA1 ;[CKEY or OKEY entry] MOS56 0672 F0E3 v2A MOS56 0678 F0E8 A0 EE LDYIM CKEY+&02 MOS56 0672 F0E3 v2A MOS56 0679 F0EA SKFMA1 MOS56 0672 F0E3 v2A MOS56 0680 F0EA ; MOS56 0672 F0E3 v2A MOS56 0681 F0EA 99 DF 01 STAAY KSCSTA-CKEY ;save scan start address MOS56 0672 F0E3 v2A MOS56 0682 F0ED ; return MI => no keys, otherwise X = key MOS56 0672 F0E3 v2A MOS56 0683 F0ED A2 09 LDXIM &09 MOS56 0672 F0E3 v2A MOS56 0684 F0EF ; MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 121 MOS56 MOS56 Keyboard management MOS56 MOS56 0672 F0E3 v2A MOS56 0685 F0EF ISCAN1 MOS56 0672 F0E3 v2A MOS56 0686 F0EF ; allow interrupts MOS56 0672 F0E3 v2A MOS56 0687 F0EF ; MOS56 0672 F0E3 v2A MOS56 0688 F0EF 20 35 F1 JSR KALLOW MOS56 0672 F0E3 v2A MOS56 0689 F0F2 ; MOS56 0672 F0E3 v2A MOS56 0690 F0F2 ; select VIAA PA6-PA0 as outputs MOS56 0672 F0E3 v2A MOS56 0691 F0F2 ; MOS56 0672 F0E3 v2A MOS56 0692 F0F2 A9 7F LDAIM &7F MOS56 0672 F0E3 v2A MOS56 0693 F0F4 8D 43 FE STA DDRAQ MOS56 0672 F0E3 v2A MOS56 0694 F0F7 ; MOS56 0672 F0E3 v2A MOS56 0695 F0F7 ; claim keyboard MOS56 0672 F0E3 v2A MOS56 0696 F0F7 ; MOS56 0672 F0E3 v2A MOS56 0697 F0F7 A9 03 LDAIM &03 MOS56 0672 F0E3 v2A MOS56 0698 F0F9 8D 40 FE STA PBQ MOS56 0672 F0E3 v2A MOS56 0699 F0FC ; MOS56 0672 F0E3 v2A MOS56 0700 F0FC ; reset keyboard interrupt line MOS56 0672 F0E3 v2A MOS56 0701 F0FC ; MOS56 0672 F0E3 v2A MOS56 0702 F0FC A9 0F LDAIM &0F ;N.B. use non-existent group which does not interrupt MOS56 0672 F0E3 v2A MOS56 0703 F0FE 8D 4F FE STA PAPQ MOS56 0672 F0E3 v2A MOS56 0704 F101 ; MOS56 0672 F0E3 v2A MOS56 0705 F101 ; clear latched event MOS56 0672 F0E3 v2A MOS56 0706 F101 ; MOS56 0672 F0E3 v2A MOS56 0707 F101 A9 01 LDAIM &01 MOS56 0672 F0E3 v2A MOS56 0708 F103 8D 4D FE STA IFRQ MOS56 0672 F0E3 v2A MOS56 0709 F106 ; MOS56 0672 F0E3 v2A MOS56 0710 F106 8E 4F FE STX PAPQ ;select key (force no key first time thru loop) MOS56 0672 F0E3 v2A MOS56 0711 F109 MOS56 0672 F0E3 v2A MOS56 0712 F109 2C 4D FE BIT IFRQ ;test for latched event MOS56 0672 F0E3 v2A MOS56 0713 F10C F0 21 BEQ ISCAND ;[no group key pressed] MOS56 0672 F0E3 v2A MOS56 0714 F10E ; MOS56 0672 F0E3 v2A MOS56 0715 F10E ; key pressed in this group MOS56 0672 F0E3 v2A MOS56 0716 F10E ; MOS56 0672 F0E3 v2A MOS56 0717 F10E 8A TXA ;A := key at start of group MOS56 0672 F0E3 v2A MOS56 0718 F10F ; MOS56 0672 F0E3 v2A MOS56 0719 F10F ISCANC ;scan group to find pressed key within group MOS56 0672 F0E3 v2A MOS56 0720 F10F ; check key against start scan address MOS56 0672 F0E3 v2A MOS56 0721 F10F ; MOS56 0672 F0E3 v2A MOS56 0722 F10F D9 DF 01 CMPAY KSCSTA-CKEY MOS56 0672 F0E3 v2A MOS56 0723 F112 90 16 BCC ISCANE ;[ignore key] MOS56 0672 F0E3 v2A MOS56 0724 F114 ; MOS56 0672 F0E3 v2A MOS56 0725 F114 8D 4F FE STA PAPQ MOS56 0672 F0E3 v2A MOS56 0726 F117 2C 4F FE BIT PAPQ MOS56 0672 F0E3 v2A MOS56 0727 F11A 10 0E BPL ISCANE ;[individual key not pressed] MOS56 0672 F0E3 v2A MOS56 0728 F11C ; MOS56 0672 F0E3 v2A MOS56 0729 F11C ; individual key pressed MOS56 0672 F0E3 v2A MOS56 0730 F11C ; MOS56 0672 F0E3 v2A MOS56 0731 F11C ISCANB ;key press detected at key A MOS56 0672 F0E3 v2A MOS56 0732 F11C ; MOS56 0672 F0E3 v2A MOS56 0733 F11C ; key found MOS56 0672 F0E3 v2A MOS56 0734 F11C ; MOS56 0672 F0E3 v2A MOS56 0735 F11C 28 PLP MOS56 0672 F0E3 v2A MOS56 0736 F11D 08 PHP MOS56 0672 F0E3 v2A MOS56 0737 F11E B0 13 BCS ISCAN9 ;[ignore no character] MOS56 0672 F0E3 v2A MOS56 0738 F120 ; MOS56 0672 F0E3 v2A MOS56 0739 F120 48 PHA ;save key code MOS56 0672 F0E3 v2A MOS56 0740 F121 ; MOS56 0672 F0E3 v2A MOS56 0741 F121 ; check whether to ignore character MOS56 0672 F0E3 v2A MOS56 0742 F121 ; MOS56 0672 F0E3 v2A MOS56 0743 F121 59 00 00 EORAY ZERO MOS56 0672 F0E3 v2A MOS56 0744 F124 0A ASLA ;ignore top bit MOS56 0672 F0E3 v2A MOS56 0745 F125 C9 01 CMPIM &01 MOS56 0672 F0E3 v2A MOS56 0746 F127 68 PLA ;restore key code MOS56 0672 F0E3 v2A MOS56 0747 F128 B0 09 BCS ISCAN9 ;[accept key] MOS56 0672 F0E3 v2A MOS56 0748 F12A ; MOS56 0672 F0E3 v2A MOS56 0749 F12A ; ignore key MOS56 0672 F0E3 v2A MOS56 0750 F12A ; MOS56 0672 F0E3 v2A MOS56 0751 F12A ISCANE ;ignore key MOS56 0672 F0E3 v2A MOS56 0752 F12A 18 CLC MOS56 0672 F0E3 v2A MOS56 0753 F12B 69 10 ADCIM &10 MOS56 0672 F0E3 v2A MOS56 0754 F12D 10 E0 BPL ISCANC ;[step to next key within group] MOS56 0672 F0E3 v2A MOS56 0755 F12F ; MOS56 0672 F0E3 v2A MOS56 0756 F12F ; key group exhausted MOS56 0672 F0E3 v2A MOS56 0757 F12F ; MOS56 0672 F0E3 v2A MOS56 0758 F12F ISCAND ;scan within group failed MOS56 0672 F0E3 v2A MOS56 0759 F12F CA DEX MOS56 0672 F0E3 v2A MOS56 0760 F130 10 BD BPL ISCAN1 ;[try next group] MOS56 0672 F0E3 v2A MOS56 0761 F132 ; no key found, X<0 MOS56 0672 F0E3 v2A MOS56 0762 F132 8A TXA ;set up to negate effect of TAX MOS56 0672 F0E3 v2A MOS56 0763 F133 ; MOS56 0672 F0E3 v2A MOS56 0764 F133 ISCAN9 ;accept key MOS56 0672 F0E3 v2A MOS56 0765 F133 AA TAX ;X := key address MOS56 0672 F0E3 v2A MOS56 0766 F134 ; MOS56 0672 F0E3 v2A MOS56 0767 F134 28 PLP MOS56 0672 F0E3 v2A MOS56 0768 F135 ; MOS56 0672 F0E3 v2A MOS56 0769 F135 KALLOW ;release keyboard and allow interrupts MOS56 0672 F0E3 v2A MOS56 0770 F135 ; **** MUST NOT CORRUPT Y **** MOS56 0672 F0E3 v2A MOS56 0771 F135 ; release keyboard MOS56 0672 F0E3 v2A MOS56 0772 F135 ; MOS56 0672 F0E3 v2A MOS56 0773 F135 20 3A F1 JSR KALLOX ;release keyboard MOS56 0672 F0E3 v2A MOS56 0774 F138 ; MOS56 0672 F0E3 v2A MOS56 0775 F138 ; allow interrupts MOS56 0672 F0E3 v2A MOS56 0776 F138 ; MOS56 0672 F0E3 v2A MOS56 0777 F138 58 CLI MOS56 0672 F0E3 v2A MOS56 0778 F139 78 SEI MOS56 0672 F0E3 v2A MOS56 0779 F13A ; MOS56 0672 F0E3 v2A MOS56 0780 F13A KALLOX ;release keyboard MOS56 0672 F0E3 v2A MOS56 0781 F13A A9 0B LDAIM &0B -- MOS56 0782 F13C 8D 40 FE STA PBQ -- MOS56 0783 F13F ; -- MOS56 0784 F13F ; return result in N -- MOS56 0785 F13F ; -- MOS56 0786 F13F 8A TXA ;N=1 => no new key, N=0 => new key in X -- MOS56 0787 F140 60 RTS -- MOS56 0788 F141 -- MOS56 0789 F141 -- MOS56 0790 F141 -- MOS56 0791 F141 < 3 -- MOS56 0792 F141 -- MOS56 0793 F141 LNK MOS70 -- MOS70 0001 F141 TTL C.F.S. Manifest File - MOS70 -- MOS70 0002 F141 OPT &01 -- MOS70 0003 F141 -- MOS70 0004 F141 0005 MOS70 * DEFOPT -- MOS70 0005 F141 0005 MOS72 * DEFOPT -- MOS70 0006 F141 0005 MOS74 * DEFOPT -- MOS70 0007 F141 0005 MOS76 * DEFOPT -- MOS70 0008 F141 -- MOS70 0009 F141 OPT MOS70 MOS70 MOS70 MOS70 MOS70 Acorn macro assembler Page 122 MOS70 C.F.S. Manifest File - MOS70 MOS70 -- MOS70 0010 F141 -- MOS70 0011 F141 < &0003 -- MOS70 0012 F141 > &0002 -- MOS70 0013 F141 -- MOS70 0014 F141 -- MOS70 0015 F141 ;****** C.F.S HEADER FILE ****** -- MOS70 0016 F141 -- MOS70 0017 F141 -- MOS70 0018 F141 -- MOS70 0019 F141 ;cIOBYTS * $00 ;No longer used -- MOS70 0020 F141 0000 LENSW * &00 ;Zero => LOAD modify's OSFILE block -- MOS70 0021 F141 0001 DEBUG * &01 ;zero => messages. +ve => no messages -- MOS70 0022 F141 0000 TUBESW * &00 ;Zero => tube, +ve => no tube -- MOS70 0023 F141 00FF PREMRG * &FF ;Zero => entry indirections, +ve => none -- MOS70 0024 F141 00FF GLYN * &FF ;Zero => special IBG code for -- MOS70 0025 F141 ;Glynn. +ve => as per spec. -- MOS70 0026 F141 -- MOS70 0027 F141 ;MANIFESTS -- MOS70 0028 F141 -- MOS70 0029 F141 00FE ENDBYT * &FE ;Byte after end of file (GETBYT) -- MOS70 0030 F141 -- MOS70 0031 F141 0091 FXCDRV * &0091 ;FX call number -- MOS70 0032 F141 00FF READFX * &FF -- MOS70 0033 F141 0000 WRITFX * &00 -- MOS70 0034 F141 -- MOS70 0035 F141 0001 INHAND * &0001 ;Input handle -- MOS70 0036 F141 0002 OUTHND * &0002 ;Output handle -- MOS70 0037 F141 0003 HNDS * &03 ;Both handles -- MOS70 0038 F141 00FD NOUTHD * &FD -- MOS70 0039 F141 000B FTSIZE * &000B ;File title size (incl. CR) -- MOS70 0040 F141 -- MOS70 0041 F141 ;Note that the 6850 status bytes (following) -- MOS70 0042 F141 ;have their bottom nybble modified according to -- MOS70 0043 F141 ;the setting of SPEED in the routines RXINIT and TXINIT -- MOS70 0044 F141 -- MOS70 0045 F141 0030 TXSTAT * &30 ;6850 TX status -- MOS70 0046 F141 ;TXSTAT = ~RTS lo;TXI enabled;8 bits + 1 stop -- MOS70 0047 F141 00D0 RXSTAT * &D0 -- MOS70 0048 F141 ;RXSTAT = ~RTS hi;TXI disabled;8 bits + 1 stop -- MOS70 0049 F141 -- MOS70 0050 F141 0002 TXBIT * &02 -- MOS70 0051 F141 0001 RXBIT * &01 -- MOS70 0052 F141 0004 DCDBIT * &04 -- MOS70 0053 F141 -- MOS70 0054 F141 0085 SERON * &85 ;Motor on/cass. on/RXCLK=0/TXCLK= 1,0,1 -- MOS70 0055 F141 0005 SEROFF * &05 ;As SERON but motor off -- MOS70 0056 F141 ;ERRORS -- MOS70 0057 F141 -- MOS70 0058 F141 00DF ERRBAS * &DF -- MOS70 0059 F141 -- MOS70 0060 F141 00DF CFSERD * ERRBAS -&00 ;EOF -- MOS70 0061 F141 00DE CFSERB * ERRBAS -&01 ;Channel -- MOS70 0062 F141 00DD CFSERK * ERRBAS -&02 ;Address -- MOS70 0063 F141 00DC SYNXER * ERRBAS -&03 ;Syntax -- MOS70 0064 F141 00DB CFSERF * ERRBAS -&04 ;File -- MOS70 0065 F141 00DA CFSERH * ERRBAS -&05 ;Block -- MOS70 0066 F141 00D9 CFSERI * ERRBAS -&06 ;Header -- MOS70 0067 F141 00D8 CFSERJ * ERRBAS -&07 ;Data -- MOS70 0068 F141 00D8 CFSERR * CFSERJ ;Bad tape -- MOS70 0069 F141 -- MOS70 0070 F141 00D7 SFSERR * ERRBAS -&08 ;Bad ROM -- MOS70 0071 F141 00D6 SFSER1 * ERRBAS -&09 ;File not found -- MOS70 0072 F141 -- MOS70 0073 F141 00D5 CFSERL * ERRBAS -&0A ;Locked -- MOS70 0074 F141 -- MOS70 0075 F141 -- MOS70 0076 F141 ;STATUS BYTE MASKS -- MOS70 0077 F141 -- MOS70 0078 F141 0001 INOPEN * &01 -- MOS70 0079 F141 0002 OUTOPN * &02 -- MOS70 0080 F141 0040 LSTBYT * &40 ;Last byte read (GETBYTE) -- MOS70 0081 F141 0080 EOFBIT * &80 ;Last byte +1 read (GETBYTE) -- MOS70 0082 F141 00C0 LSTEOF * &C0 ;Last byte & EOF -- MOS70 0083 F141 -- MOS70 0084 F141 00F7 NCTBIT * &F7 ;Complement of CATBIT -- MOS70 0085 F141 003F NEFBIT * &3F ;Complement of EOFBIT/lastbyte -- MOS70 0086 F141 00FE NINHND * &FE ;Complement of INHAND -- MOS70 0087 F141 003E NECBIT * &3E ;Complement of EOFBIT/lastbyte/openin bit -- MOS70 0088 F141 -- MOS70 0089 F141 -- MOS70 0090 F141 -- MOS70 0091 F141 ;MESSAGE/ERROR SELECTION MASKS -- MOS70 0092 F141 -- MOS70 0093 F141 -- MOS70 0094 F141 00CC ERRMSK * &CC ;Error bits to zero -- MOS70 0095 F141 0033 MSGMSK * &33 ;Message bits to zero -- MOS70 0096 F141 0088 MSGS1 * &88 ;Short messages -- MOS70 0097 F141 00CC MSGS2 * &CC ;Long messages -- MOS70 0098 F141 -- MOS70 0099 F141 0011 ABTBIT * &11 ;Abort set -- MOS70 0100 F141 0022 RETBIT * &22 ;Retry set -- MOS70 0101 F141 0000 IGBIT * &00 ;Both error bits off => ignore -- MOS70 0102 F141 0030 NIGBIT * &30 ;Complement of ignore bits -- MOS70 0103 F141 -- MOS70 0104 F141 00A1 DEFLT * &A1 -- MOS70 0105 F141 -- MOS70 0106 F141 ;Default is retry/messages for loaded and saved -- MOS70 0107 F141 ;files, abort/no messages for sequential files. -- MOS70 0108 F141 -- MOS70 0109 F141 -- MOS70 0110 F141 ;INFO FIELDS -- MOS70 0111 F141 -- MOS70 0112 F141 000C BKINFO * FTSIZE +&01 -- MOS70 0113 F141 000C BKLOAD * BKINFO -- MOS70 0114 F141 000C BKLDLO * BKLOAD -- MOS70 0115 F