PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 1 PC Machine Code I Line File: A 1 COMMENT /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 2 (C) Copyright Intel Corp., 1996 A 3 A 4 File: LOOPBACK&ISO&SUSRSM.asm A 5 A 6 Universal Serial Bus 930 Test firmware A 7 A 8 Revision History A 9 --------------------------------------------- A 10 0.3 09-12-96 Myngoc Le A 11 0.2 05-27-96 Abdul Rahman Ismail A 12 0.1 02-13-96 Joe DrAgony A 13 A 14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ A 15 B 0 INCLUDE "swap.INC" B 1 COMMENT /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ B 2 (C) Copyright Intel Corp., 1996 B 3 B 4 File: swap.inc B 5 B 6 Universal Serial Bus 930 Test firmware B 7 B 8 Revision History B 9 --------------------------------------------- B 10 0.1 05-27-96 Abdul Rahman Ismail B 11 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ B 12 B 13 SWAP_BYTES: MACRO Reg1, Reg2, Reg3 B 14 mov Reg3, Reg1 B 15 mov Reg1, Reg2 B 16 mov Reg2, Reg3 B 17 ENDMAC SWAP_BYTES B 18 B 19 DEBUG_PORT: MACRO Reg1, Immeadiate B 20 mov Reg1, gbDebugMess B 21 orl Reg1, #Immeadiate B 22 mov gbDebugMess, Reg1 B 23 mov P1, Reg1 B 24 ENDMAC DEBUG_PORT B 25 B 26 A 17 B 0 INCLUDE "82930aa.INC" B 1 ;####################################################################### B 2 ;# $Source: q:/include/82930hx.inc $ # B 3 ;# $Revision: 1.0 $ # B 4 ;# # B 5 ;# $Date: 1996/04/18 20:02:32 $ # B 6 ;# # B 7 ;# Author: Joe Murray # B 8 ;# $Locker: $ # PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 2 PC Machine Code I Line File: 82930aa.INC B 9 ;# # B 10 ;# Platform: 82930AA DUT on ISA SV Board # B 11 ;# # B 12 ;# Description: # B 13 ;# This file contains EQUates for HUB SFRs. # B 14 ;# B 15 ;# * * * Do NOT Include this file directly! * * * # B 16 ;# You should define PROC equ "something" and include 82930.inc # B 17 ;# # B 18 ;# ------------------------------------------------------------------- # B 19 ;# REVISION HISTORY: # B 20 ;# ------------------------------------------------------------------- # B 21 ;# $Log: hello.asm,v $ B 22 ;# Revision 1.0 1996/06/20 20:02:32 Joe Murray B 23 ;# Initial revision B 24 ;# B 25 ;####################################################################### B 26 B 27 ;############################################################################## B 28 ;# Filename: hub_def.asm B 29 ;# B 30 ;# Author: Joe Murray. B 31 ;# B 32 ;# Date: 22/Feb/96 B 33 ;# B 34 ;# Description: EQUates for the 82930AA SFRs B 35 ;# B 36 ;############################################################################## B 37 00000085 B 38 DPXL: EQU 85h B 39 000000FF B 40 SBTM: EQU 0FFH 000000F1 B 41 EPINDEX: EQU 0F1H B 42 000000F2 B 43 TXSTAT: EQU 0F2H 000000F2 B 44 TXSTAT0: EQU 0F2H 000000F2 B 45 TXSTAT1: EQU 0F2H 000000F2 B 46 TXSTAT2: EQU 0F2H 000000F2 B 47 TXSTAT3: EQU 0F2H 000000F2 B 48 HTXSTAT0: EQU 0F2H B 49 000000F3 B 50 TXDAT: EQU 0F3H 000000F3 B 51 TXDAT0: EQU 0F3H 000000F3 B 52 TXDAT1: EQU 0F3H 000000F3 B 53 TXDAT2: EQU 0F3H 000000F3 B 54 TXDAT3: EQU 0F3H 000000F3 B 55 FTXDAT0: EQU 0F3H 000000F3 B 56 FTXDAT1: EQU 0F3H 000000F3 B 57 FTXDAT2: EQU 0F3H 000000F3 B 58 FTXDAT3: EQU 0F3H 000000F3 B 59 HTXDAT0: EQU 0F3H 000000F3 B 60 HTXDAT1: EQU 0F3H PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 3 PC Machine Code I Line File: 82930aa.INC B 61 000000F4 B 62 TXCON: EQU 0F4H 000000F4 B 63 TXCON0: EQU 0F4H 000000F4 B 64 TXCON1: EQU 0F4H 000000F4 B 65 TXCON2: EQU 0F4H 000000F4 B 66 TXCON3: EQU 0F4H B 67 000000F4 B 68 FTXCON0: EQU 0F4H 000000F4 B 69 FTXCON1: EQU 0F4H 000000F4 B 70 FTXCON2: EQU 0F4H 000000F4 B 71 FTXCON3: EQU 0F4H 000000F4 B 72 HTXCON0: EQU 0F4H B 73 000000F5 B 74 TXFLG: EQU 0F5H 000000F5 B 75 TXFLG0: EQU 0F5H 000000F5 B 76 TXFLG1: EQU 0F5H 000000F5 B 77 TXFLG2: EQU 0F5H 000000F5 B 78 TXFLG3: EQU 0F5H 000000F5 B 79 FTXFLG0: EQU 0F5H 000000F5 B 80 FTXFLG1: EQU 0F5H 000000F5 B 81 FTXFLG2: EQU 0F5H 000000F5 B 82 FTXFLG3: EQU 0F5H 000000F5 B 83 HTXFLG0: EQU 0F5H B 84 B 85 B 86 000000F6 B 87 TXCNT0: EQU 0F6h 000000F6 B 88 TXCNT1: EQU 0F6h 000000F6 B 89 TXCNT2: EQU 0F6h 000000F6 B 90 TXCNT3: EQU 0F6h B 91 000000F6 B 92 TXCNT: EQU 0F6H 000000F6 B 93 FTXCNTO: EQU 0F6H 000000F6 B 94 FTXCNT1: EQU 0F6H 000000F6 B 95 FTXCNT2: EQU 0F6H 000000F6 B 96 FTXCNT3: EQU 0F6H 000000F6 B 97 HTXCNTO: EQU 0F6H 000000F6 B 98 TXCNTL: EQU 0F6H 000000F7 B 99 TXCNTH: EQU 0F7H B 100 000000E8 B 101 HIS: EQU 0E8H B 102 000000EF B 103 UICECON: EQU 0EFH B 104 000000E1 B 105 EPCON: EQU 0E1H 000000E1 B 106 EPCON0: EQU 0E1H 000000E1 B 107 EPCON1: EQU 0E1H 000000E1 B 108 EPCON2: EQU 0E1H 000000E1 B 109 EPCON3: EQU 0E1H 000000E1 B 110 HEPCON0: EQU 0E1H B 111 000000E2 B 112 RXSTAT: EQU 0E2H PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 4 PC Machine Code I Line File: 82930aa.INC 000000E2 B 113 RXSTAT0: EQU 0E2H 000000E2 B 114 RXSTAT1: EQU 0E2H 000000E2 B 115 RXSTAT2: EQU 0E2H 000000E2 B 116 RXSTAT3: EQU 0E2H 000000E2 B 117 HRXSTAT0: EQU 0E2H B 118 000000E3 B 119 RXDAT: EQU 0E3H 000000E3 B 120 RXDAT0: EQU 0E3H 000000E3 B 121 RXDAT1: EQU 0E3H 000000E3 B 122 RXDAT2: EQU 0E3H 000000E3 B 123 RXDAT3: EQU 0E3H B 124 000000E3 B 125 FRXDAT0: EQU 0E3H 000000E3 B 126 FRXDAT1: EQU 0E3H 000000E3 B 127 FRXDAT2: EQU 0E3H 000000E3 B 128 FRXDAT3: EQU 0E3H 000000E3 B 129 HRXDAT0: EQU 0E3H B 130 000000E4 B 131 RXCON: EQU 0E4H 000000E4 B 132 RXCON0: EQU 0E4H 000000E4 B 133 RXCON1: EQU 0E4H 000000E4 B 134 RXCON2: EQU 0E4H 000000E4 B 135 RXCON3: EQU 0E4H B 136 000000E4 B 137 FRXCON0: EQU 0E4H 000000E4 B 138 FRXCON1: EQU 0E4H 000000E4 B 139 FRXCON2: EQU 0E4H 000000E4 B 140 FRXCON3: EQU 0E4H 000000E4 B 141 HRXCON0: EQU 0E4H B 142 000000E5 B 143 RXFLG: EQU 0E5H 000000E5 B 144 RXFLG0: EQU 0E5H 000000E5 B 145 RXFLG1: EQU 0E5H 000000E5 B 146 RXFLG2: EQU 0E5H 000000E5 B 147 RXFLG3: EQU 0E5H B 148 B 149 000000E5 B 150 FRXFLG: EQU 0E5H 000000E5 B 151 FRXFLG0: EQU 0E5H 000000E5 B 152 FRXFLG1: EQU 0E5H 000000E5 B 153 FRXFLG2: EQU 0E5H 000000E5 B 154 FRXFLG3: EQU 0E5H 000000E5 B 155 HRXFLG0: EQU 0E5H B 156 B 157 000000E6 B 158 RXCNT0: EQU 0E6h 000000E6 B 159 RXCNT1: EQU 0E6h 000000E6 B 160 RXCNT2: EQU 0E6h 000000E6 B 161 RXCNT3: EQU 0E6h B 162 000000E6 B 163 RXCNT: EQU 0E6H 000000E6 B 164 FRXCNT0: EQU 0E6H PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 5 PC Machine Code I Line File: 82930aa.INC 000000E6 B 165 FRXCNT1: EQU 0E6H 000000E6 B 166 FR2XCNT2: EQU 0E6H 000000E6 B 167 FRXCNT3: EQU 0E6H 000000E6 B 168 HRXCNT0: EQU 0E6H 000000E6 B 169 RXCNTL: EQU 0E6H 000000E7 B 170 RXCNTH: EQU 0E7H B 171 000000DF B 172 UPWCON: EQU 0DFH 000000D2 B 173 SOFL: EQU 0D2H 000000D3 B 174 SOFH: EQU 0D3H 000000D4 B 175 UPINDEX: EQU 0D4H B 176 000000D5 B 177 UPSTCH: EQU 0D5H 000000D5 B 178 UPSTCH1: EQU 0D5H 000000D5 B 179 UPSTCH2: EQU 0D5H 000000D5 B 180 UPSTCH3: EQU 0D5H 000000D5 B 181 UPSTCH4: EQU 0D5H B 182 000000D7 B 183 UPSTAT: EQU 0D7H 000000D7 B 184 UPSTAT1: EQU 0D7H 000000D7 B 185 UPSTAT2: EQU 0D7H 000000D7 B 186 UPSTAT3: EQU 0D7H 000000D7 B 187 UPSTAT4: EQU 0D7H B 188 000000CF B 189 UPCON: EQU 0CFH 000000CF B 190 UPCON1: EQU 0CFH 000000CF B 191 UPCON2: EQU 0CFH 000000CF B 192 UPCON3: EQU 0CFH 000000CF B 193 UPCON4: EQU 0CFH B 194 B 195 B 196 000000B5 B 197 HFRTMRL: EQU 0B5H 000000B6 B 198 HFRTMRH: EQU 0B6H 000000AE B 199 HSTAT: EQU 0AEH 000000A1 B 200 HIE: EQU 0A1H 000000A2 B 201 FIE: EQU 0A2H B 202 ;FIS: EQU 0C0h 000000C0 B 203 SBI: EQU 0C0H ; Backward COmpatible 0000009A B 204 UPPWR: EQU 09AH 00000097 B 205 HADDR: EQU 097H 0000008F B 206 FADDR: EQU 08FH B 207 B 208 ;---------------------------------- B 209 ;- INTERRUPT REGISTERS B 210 ;---------------------------------- 000000B1 B 211 IEA: EQU 0B1H B 212 000000A8 B 213 IEN0 EQU 0A8H 000000B2 B 214 IPA: EQU 0B2H 000000B3 B 215 IPA1: EQU 0B3H B 216 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 6 PC Machine Code I Line File: 82930aa.INC 000000B1 B 217 AA_IE1: EQU 0B1H B 218 B 219 ;IE0: EQU 0A8H B 220 ;IPH0: EQU 0B7H B 221 ;IPL0: EQU 0B8H 000000B3 B 222 IPH1: EQU 0B3H 000000B2 B 223 IPL1: EQU 0B2H B 224 ;SBIE: EQU 0A2H B 225 B 226 B 227 ;---------------------------------- B 228 ;- USB INTERRUPT ENABLES B 229 ;---------------------------------- 000000B1 B 230 IEN1: EQU 0B1H B 231 B 232 ESOF: EQU IEN1.0 B 233 ;EF: EQU IEN1.1 B 234 ESR: EQU IEN1.2 B 235 B 236 ;---------------------------------- B 237 ;- PCON B 238 ;---------------------------------- B 239 ;PCON EQU 087h B 240 LC EQU PCON.5 B 241 POF EQU PCON.4 B 242 PD EQU PCON.1 B 243 IDL EQU PCON.0 B 244 B 245 B 246 B 247 ;---------------------------------- B 248 ;- PCON1 B 249 ;---------------------------------- B 250 000000DF B 251 PCON1 EQU 0DFh B 252 RWU EQU PCON1.2 B 253 ;G_RSM EQU PCON1.1 B 254 ;G_SUS EQU PCON1.0 B 255 GRSM EQU PCON1.1 B 256 GSUS EQU PCON1.0 B 257 B 258 ;---------------------------------- B 259 ;- SOFH B 260 ;---------------------------------- B 261 SFACK EQU SOFH.7 B 262 ASOF EQU SOFH.6 B 263 SOFIE EQU SOFH.5 B 264 FLOCK EQU SOFH.4 B 265 SOFDIS EQU SOFH.3 B 266 B 267 ;---------------------------------- B 268 ;- EPCON PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 7 PC Machine Code I Line File: 82930aa.INC B 269 ;---------------------------------- B 270 RXSTL EQU EPCON.7 B 271 TXSTL EQU EPCON.6 B 272 CTLEP EQU EPCON.5 B 273 RXSPM EQU EPCON.4 B 274 RXIE EQU EPCON.3 B 275 RXEPEN EQU EPCON.2 B 276 TXOE EQU EPCON.1 B 277 TXEPEN EQU EPCON.7 B 278 B 279 ;---------------------------------- B 280 ;- RXSTAT B 281 ;---------------------------------- B 282 RXSEQ EQU RXSTAT.7 B 283 RXSETUP EQU RXSTAT.6 B 284 STOVW EQU RXSTAT.5 B 285 EDOVW EQU RXSTAT.4 B 286 RXDTO EQU RXSTAT.3 B 287 RXVOID EQU RXSTAT.2 B 288 RXERR EQU RXSTAT.1 B 289 RXACK EQU RXSTAT.0 B 290 B 291 ;---------------------------------- B 292 ;- TXSTAT B 293 ;---------------------------------- B 294 TXSEQ EQU TXSTAT.7 B 295 ;-- B 296 ;-- B 297 TXFLUSH EQU TXSTAT.4 B 298 TXDTO EQU TXSTAT.3 B 299 TXVOID EQU TXSTAT.2 B 300 TXERR EQU TXSTAT.1 B 301 TXACK EQU TXSTAT.0 B 302 B 303 B 304 B 305 ;---------------------------------- B 306 ;- RXCON B 307 ;---------------------------------- B 308 RXCLR EQU RXCON.7 B 309 ;- B 310 RXWS EQU RXCON.5 B 311 RXFFRC EQU RXCON.4 B 312 RXISO EQU RXCON.3 B 313 ARM EQU RXCON.2 B 314 ADVWM EQU RXCON.1 B 315 REVWP EQU RXCON.0 B 316 B 317 ;---------------------------------- B 318 ;- TXCON B 319 ;---------------------------------- B 320 TXCLR EQU TXCON.7 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 8 PC Machine Code I Line File: 82930aa.INC B 321 ;- B 322 TXWS EQU TXCON.5 B 323 TXFFRC EQU TXCON.4 B 324 TXISO EQU TXCON.3 B 325 ATM EQU TXCON.2 B 326 ADVRM EQU TXCON.1 B 327 REVRP EQU TXCON.0 B 328 B 329 B 330 ;---------------------------------- B 331 ;- FIE B 332 ;---------------------------------- B 333 FTXIE0 EQU FIE.0 B 334 FRXIE0 EQU FIE.1 B 335 FTXIE1 EQU FIE.2 B 336 FRXIE1 EQU FIE.3 B 337 FTXIE2 EQU FIE.4 B 338 FRXIE2 EQU FIE.5 B 339 FTXIE3 EQU FIE.6 B 340 FRXIE3 EQU FIE.7 B 341 B 342 ;---------------------------------- B 343 ;- FIFLG B 344 ;---------------------------------- 000000C0 B 345 FIFLG EQU 0C0H B 346 FTXD0 EQU FIFLG.0 B 347 FRXD0 EQU FIFLG.1 B 348 FTXD1 EQU FIFLG.2 B 349 FRXD1 EQU FIFLG.3 B 350 FTXD2 EQU FIFLG.4 B 351 FRXD2 EQU FIFLG.5 B 352 FTXD3 EQU FIFLG.6 B 353 FRXD3 EQU FIFLG.7 B 354 B 355 ;---------------------------------- B 356 ;- RXFLG B 357 ;---------------------------------- B 358 RXFIF1 EQU RXFLG.7 B 359 RXFIF0 EQU RXFLG.6 B 360 ;--- B 361 ;--- B 362 RXEMP EQU RXFLG.3 B 363 RXFULL EQU RXFLG.2 B 364 RXURF EQU RXFLG.1 B 365 RXOVF EQU RXFLG.0 B 366 B 367 B 368 ;---------------------------------- B 369 ;- TXFLG B 370 ;---------------------------------- B 371 TXFIF1 EQU TXFLG.7 B 372 TXFIF0 EQU TXFLG.6 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 9 PC Machine Code I Line File: 82930aa.INC B 373 ;--- B 374 ;--- B 375 TXEMP EQU TXFLG.3 B 376 TXFULL EQU TXFLG.2 B 377 TXURF EQU TXFLG.1 B 378 TXOVF EQU TXFLG.0 B 379 B 380 B 381 B 382 A 19 B 0 INCLUDE "ONE_OH.INC" B 1 COMMENT /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ B 2 (C) Copyright Intel Corp., 1996 B 3 B 4 File: one_oh.inc B 5 B 6 Universal Serial Bus 930 Test firmware B 7 B 8 Revision History B 9 --------------------------------------------- B 10 0.3 B 11 0.2 05-27-96 Abdul Rahman Ismail B 12 0.1 02-13-96 Joe DrAgony B 13 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ B 14 ; B 15 ; ONE_OH.INC: This file contains equates related to the operations under USB Spec. rev 1.0 B 16 ; It also includes equates for 82930 register manipulation B 17 ; B 18 B 19 ;<<<<<<<<<<<<<< B 20 ;bRequest Types B 21 ;>>>>>>>>>>>>>> B 22 00000000 B 23 GET_STATUS equ 00h 00000001 B 24 CLEAR_FEATURE equ 01h 00000002 B 25 RESERVED1 equ 02h 00000003 B 26 SET_FEATURE equ 03h 00000004 B 27 RESERVED2 equ 04h 00000005 B 28 SET_ADDRESS equ 05h 00000006 B 29 GET_DESCRIPTOR equ 06h 00000007 B 30 SET_DESCRIPTOR equ 07h 00000008 B 31 GET_CONFIGURATION equ 08h 00000009 B 32 SET_CONFIGURATION equ 09h 0000000A B 33 GET_INTERFACE equ 0Ah 0000000B B 34 SET_INTERFACE equ 0Bh 0000000C B 35 SYCH_FRAME equ 0Ch B 36 B 37 ; B 38 ;Descriptor Types B 39 ; 00000001 B 40 DEVICE_DESCR equ 01h PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 10 PC Machine Code I Line File: ONE_OH.INC 00000002 B 41 CONFIG_DESCR equ 02h 00000003 B 42 STRING_DESCR equ 03h 00000004 B 43 INTERFACE_DESCR equ 04h 00000005 B 44 ENDPOINT_DESCR equ 05h 00000006 B 45 SUSPEND_DESCR equ 06h B 46 B 47 ; B 48 ;HID specific descriptor types 00000021 B 49 HID_DESCR equ 021h 00000022 B 50 ENTITY_DESCR equ 022h B 51 B 52 ; B 53 ;Feature Selectors B 54 ; B 55 B 56 00000001 B 57 DEVICE_REMOTE_WAKEUP equ 01h 00000000 B 58 ENDPOINT_STALL equ 00h B 59 B 60 B 61 B 62 B 63 ; B 64 ;Equates for clearing bits in SBI register B 65 ; B 66 B 67 000000FE B 68 EP0_TX_CLR equ 0FEh 000000FD B 69 EP0_RX_CLR equ 0FDh B 70 000000FB B 71 EP1_TX_CLR equ 0FBh 000000F7 B 72 EP1_RX_CLR equ 0F7h B 73 000000EF B 74 EP2_TX_CLR equ 0EFh 000000DF B 75 EP2_RX_CLR equ 0DFh B 76 000000BF B 77 EP3_TX_CLR equ 0BFh 0000007F B 78 EP3_RX_CLR equ 07Fh B 79 B 80 B 81 ; B 82 ;Equates to access EP management variables B 83 ; B 84 00000800 B 85 EPRXPTROFFSET equ 0800h 00000802 B 86 EPTXPTROFFSET equ 0802h 00000804 B 87 EPDATACNTOFFSET equ 0804h B 88 B 89 ; B 90 ; Ring buffer size (actually one less...) B 91 ; 000007FF B 92 RINGBUFFSIZE equ 07FFh PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 11 PC Machine Code I Line File: ONE_OH.INC B 93 B 94 ; B 95 ;Equates for masking registers, addresses, and counters B 96 ; 0000F7FF B 97 RINGBUFFMASK equ 0F7FFh 000007FF B 98 RINGWORDMASK equ 07FFh 000000C0 B 99 FIFBITMASK equ 0C0h B 100 00000008 B 101 EP0MAXPACKET equ 08h 00000400 B 102 EP1MAXPACKET equ 0400h 00000008 B 103 EP2MAXPACKET equ 08h 00000008 B 104 EP3MAXPACKET equ 08h B 105 00000001 B 106 R_ACK equ 01h 00000002 B 107 R_ERR equ 02h 00000004 B 108 R_VOID equ 04h 00000040 B 109 R_SETUP equ 40h 00000080 B 110 R_SEQ equ 80h B 111 00000012 B 112 DEVICE_DESCRIPTOR_LENGTH equ 012h 00000019 B 113 CONFIG_DESCRIPTOR_LENGTH equ 019h B 114 00000004 B 115 GET_REQUEST_TYPE_OFFSET equ 004h B 116 00000008 B 117 SETUP_PACKET_LENGTH equ 008h A 21 A 22 ;------------- External functions - process.c A 23 ;EXTERN _SetFeature:CODE A 24 ;EXTERN _ClearFeature:CODE A 25 ;EXTERN _GetStatus:CODE A 26 ;EXTERN _SetLEDs:CODE A 27 EXTERN _SetInterface:CODE A 28 A 29 PUBLIC _TestThing A 30 PUBLIC _SOF_Init_FIFOs A 31 A 32 ;------------- Global variables. A 33 XDEF _EP1RxPtr, _EP1TxPtr, _EP1DataCount A 34 A 35 XDEF _EP2RxPtr, _EP2TxPtr, _EP2DataCount A 36 A 37 XDEF _EP3RxPtr, _EP3TxPtr, _EP3DataCount A 38 A 39 XDEF _gbMPSEndPoint1 A 40 XDEF _gbMPSEndPoint2 A 41 A 42 DEFINE CCB_SEGMENT, SPACE=CODE, ORG=0ff7ff8H A 43 SEGMENT CCB_SEGMENT A 44 ; CCB0 A 45 ; - WSA1# WSA0# XALE# RD1 RD0 PAGE# SRC A 46 ; CCB1 A 47 ; - - - INTR - WSB1# WSB0# EMAP# PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 12 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 48 00FF7FF8 92 A 49 db 092h ; D2 Original Binary Mode-Paged Mode 00FF7FF9 F1 A 50 db 0F1h ; F7 Normal A 51 A 52 ;TO DO A 53 ; Change Packet Transfer to use Words not bytes. 00000008 A 54 FIFO_SIZE equ 8 A 55 A 56 CSEG AT FF:0000H 00FF0000 02 0100 A 57 LJMP main A 58 A 59 CSEG AT FF:0003H ; INT0# A 60 ; LJMP INT0_ISR 00FF0003 02 0300 A 61 LJMP RWK_ISR A 62 A 63 CSEG AT FF:0013H ; INT1# A 64 ; LJMP INT1_ISR 00FF0013 02 0300 A 65 LJMP RWK_ISR A 66 A 67 CSEG AT FF:0043H ; Any SOF (ISO Endpoint) 00FF0043 02 0150 A 68 LJMP SOF_ISR A 69 A 70 CSEG AT FF:004BH ; USB Function (FTXDx,FRXDx)x=0,1,2,3 00FF004B 02 0142 A 71 LJMP EPx_ISR A 72 A 73 CSEG AT FF:0053H ;USB Global Suspend/Resume 00FF0053 02 0304 A 74 LJMP Sus_ISR A 75 A 76 A 77 CSEG AT FF:0100H 00FF0100 A 78 main: 00FF0100 758100 A 79 mov SP, #00h 00FF0103 75BE05 A 80 mov SPH, #05h ; Set the stack to start @ 00:0500h 00FF0106 7585FF A 81 mov DPXL, #0ffh ; Set DPXL to point at the FLASH device to access constan 00FF0109 75A800 A 82 mov IEN0, #00h ; Disable all interrupts 00FF010C 75903C A 83 mov P1, #3Ch 00FF010F 12 0B24 A 84 lCall INIT_VARIABLES ; Initialize the RAM space as required 00FF0112 759066 A 85 mov P1, #66h 00FF0115 12 0A8D A 86 lCall INIT_USB ; Initialize the USB subsystem A 87 00FF0118 7590CC A 88 mov P1, #0CCh A 89 00FF011B A57E8008 A 90 mov R8, #8 ; same as 00:gEP_wMaxPacketSize 00FF011F A57A83 D806 A 91 mov 00:_gbMPSEndPoint1, R8 A 92 00FF0124 A57E8008 A 93 mov R8, #8 ; same as 00:gEPB_wMaxPacketSize 00FF0128 A57A83 D807 A 94 mov 00:_gbMPSEndPoint2, R8 A 95 00FF012D 12 01DC A 96 call _SOF_Init_FIFOs A 97 00FF0130 759099 A 98 mov P1, #099h A 99 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 13 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0133 75A884 A 100 MOV IEN0, #84h ; Enable Global Interrupts 00FF0136 75B107 A 101 MOV IEN1, #07h ; Enable USB Interrupts 00FF0139 C28A A 102 CLR IT1 ; set INT1# to level sensitive A 103 00FF013B A5A9D5D3 A 104 setb SOFIE ; Enable SOF interrupts A 105 00FF013F 02 0328 A 106 ljmp ActiveLoop ;Jump over the ISR stubs to the main loop. A 107 A 108 ;Interrupts 00FF0142 A 109 EPx_ISR: 00FF0142 32 A 110 RetI A 111 00FF0143 A 112 _TestThing: 00FF0143 A57E81D3 A 113 mov R8, SOFH 00FF0147 A55E8007 A 114 anl R8, #07h 00FF014B A57A8190 A 115 mov P1, R8 00FF014F 22 A 116 ret A 117 A 118 00FF0150 A 119 SOF_ISR: 00FF0150 A5CA78 A 120 push R7 00FF0153 A5CA88 A 121 push R8 00FF0156 A5CA98 A 122 push R9 00FF0159 C0F1 A 123 push EPINDEX A 124 A 125 ;??????? Some test code. Remove when finished testing. 00FF015B A57E73 D80D A 126 mov R7, TestVal ; 00FF0160 A5BE7000 A 127 cmp R7, #0 00FF0164 A578 0C A 128 jne ?around A 129 ;??????? A 130 ;; Put the counter on to see something working 00FF0167 A57E81D3 A 131 mov R8, SOFH 00FF016B A55E8007 A 132 anl R8, #07h 00FF016F A57A8190 A 133 mov P1, R8 A 134 00FF0173 A 135 ?around: A 136 ;; FOr testing only A 137 ; push R8 A 138 ; lcall _SetLEDs A 139 ; pop R8 A 140 ;; End for testing only A 141 00FF0173 A5A9C6D3 A 142 clr ASOF A 143 A 144 ;??????? Some test code. Remove when finished testing. A 145 ; mov R7, TestVal ; A 146 ; cmp R7, #0 A 147 ; je SOF_ISR_exit A 148 ;??????? A 149 A 150 ; jmp SOF_ISR_exit 00FF0177 02 0230 A 151 jmp ISO_REC PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 14 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 152 A 153 ;; First check to see if there were any overflows. If so, then A 154 ;; Just re-init the fifos and start over. This should never happen A 155 ;; for transmits 00FF017A 75F101 A 156 mov EPINDEX, #1 00FF017D A5A930F5 09 A 157 jnb TXOVF, ?SOF_Check_EP2 00FF0182 A5A9C0F5 A 158 clr TXOVF 00FF0186 12 01DC A 159 call _SOF_Init_FIFOs 00FF0189 80 45 A 160 jmp SOF_ISR_exit A 161 00FF018B A 162 ?SOF_Check_EP2: 00FF018B 75F102 A 163 mov EPINDEX, #2 00FF018E A5A930F5 09 A 164 jnb TXOVF, ?SOF_Check_FIFOs 00FF0193 A5A9C0F5 A 165 clr TXOVF 00FF0197 12 01DC A 166 call _SOF_Init_FIFOs 00FF019A 80 34 A 167 jmp SOF_ISR_exit A 168 A 169 00FF019C A 170 ?SOF_Check_FIFOs: 00FF019C A57E81D2 A 171 mov R8, SOFL ; preload R8 with the right value A 172 00FF01A0 75F101 A 173 mov EPINDEX, #1 00FF01A3 AFF5 A 174 mov R7, TXFLG 00FF01A5 A55E70C0 A 175 anl R7, #0C0h ; Check if both bits are set 00FF01A9 A5BE70C0 A 176 cmp R7, #0C0h 00FF01AD A568 08 A 177 je ?SOF_Check_FIFO2 ; and if so, skip to next A 178 00FF01B0 A57E73 D806 A 179 mov R7,_gbMPSEndPoint1 00FF01B5 12 0221 A 180 call SOF_Load_FIFO A 181 00FF01B8 A 182 ?SOF_Check_FIFO2: 00FF01B8 75F102 A 183 mov EPINDEX, #2 00FF01BB AFF5 A 184 mov R7, TXFLG 00FF01BD A55E70C0 A 185 anl R7, #0C0h ; Check if both bits are set 00FF01C1 A5BE70C0 A 186 cmp R7, #0C0h 00FF01C5 A568 08 A 187 je SOF_ISR_exit ; and if so, no room so return A 188 00FF01C8 A57E73 D807 A 189 mov R7,_gbMPSEndPoint2 00FF01CD 12 0221 A 190 call SOF_Load_FIFO A 191 00FF01D0 A 192 SOF_ISR_exit: 00FF01D0 D0F1 A 193 pop EPINDEX 00FF01D2 A5DA98 A 194 pop R9 00FF01D5 A5DA88 A 195 pop R8 00FF01D8 A5DA78 A 196 pop R7 A 197 00FF01DB 32 A 198 RetI A 199 A 200 ;; This routine will init the FIFOs for both pipes. 00FF01DC A 201 _SOF_Init_FIFOs: 00FF01DC A5CA88 A 202 push R8 00FF01DF A5CA78 A 203 push R7 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 15 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF01E2 C0F1 A 204 push EPINDEX A 205 00FF01E4 75F101 A 206 mov EPINDEX, #1 00FF01E7 A5A9D7F4 A 207 setb TXCLR 00FF01EB A57E8000 A 208 mov R8, #0 00FF01EF A57E73 D806 A 209 mov R7, 00: _gbMPSEndPoint1 00FF01F4 12 0221 A 210 call SOF_Load_FIFO 00FF01F7 A57E8001 A 211 mov R8, #1 00FF01FB 12 0221 A 212 call SOF_Load_FIFO A 213 00FF01FE 75F102 A 214 mov EPINDEX, #2 00FF0201 A5A9D7F4 A 215 setb TXCLR 00FF0205 A57E8000 A 216 mov R8, #0 00FF0209 A57E73 D807 A 217 mov R7, 00: _gbMPSEndPoint2 00FF020E 12 0221 A 218 call SOF_Load_FIFO 00FF0211 A57E8001 A 219 mov R8, #1 00FF0215 12 0221 A 220 call SOF_Load_FIFO A 221 00FF0218 D0F1 A 222 pop EPINDEX 00FF021A A5DA78 A 223 pop R7 00FF021D A5DA88 A 224 pop R8 00FF0220 22 A 225 ret A 226 A 227 A 228 ;; This routine assumes that R7 holds the number of bytes to write A 229 ;; into the FIFO, and that R8 holds the value, and that EPINDEX is A 230 ;; setup properly. Registers are preserved. 00FF0221 A 231 SOF_Load_FIFO: 00FF0221 A5CA78 A 232 push R7 A 233 00FF0224 A 234 ?Fill_SOF_FIFO: 00FF0224 A57A81F3 A 235 mov TXDAT, R8 00FF0228 DF FA A 236 djnz R7, ?Fill_SOF_FIFO A 237 00FF022A A5DA78 A 238 pop R7 00FF022D 8FF6 A 239 mov TXCNTL, R7 00FF022F 22 A 240 Ret A 241 A 242 A 243 ;------------------------------------------------------------------ A 244 ; ISO receive portion A 245 ;------------------------------------------------------------------ 00FF0230 A 246 ISO_REC: 00FF0230 75F101 A 247 mov EPINDEX,#1 00FF0233 12 0293 A 248 call handle_ISO_OUT A 249 00FF0236 75F102 A 250 mov EPINDEX,#2 00FF0239 12 0293 A 251 call handle_ISO_OUT A 252 00FF023C 75F103 A 253 mov EPINDEX,#3 00FF023F 12 0293 A 254 call handle_ISO_OUT A 255 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 16 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0242 A57E83 D80C A 256 mov R8, ISO_out_err 00FF0247 A5BE8000 A 257 cmp R8, #0 00FF024B A568 82 A 258 je SOF_ISR_exit A 259 A 260 ;; Here is where we send something back. Let's use EP3 just so things A 261 ;; don't go in order. What gets sent back is three bytes. The first two bytes A 262 ;; is the current Frame Number. The third byte is a bitmap indicating which A 263 ;; EP had a break in the ISO stream. Bit0->EP1, Bit1->EP2, Bit2->EP3. A 264 ;; Note that ISO_out_err has the appropriate pattern loaded into it. A 265 A 266 ;; First, see if there is any room in the TX fifo A 267 00FF024E C0F1 A 268 push EPINDEX 00FF0250 75F103 A 269 mov EPINDEX, #3 00FF0253 AFF5 A 270 mov R7, TXFLG 00FF0255 A55E70C0 A 271 anl R7, #0C0h ; Check if both bits are set 00FF0259 A5BE70C0 A 272 cmp R7, #0C0h 00FF025D A568 25 A 273 je report_exit ; and if so, we can't report now A 274 A 275 ;; If we get here, then there was room for the report 00FF0260 A57E91D2 A 276 mov R9, SOFL 00FF0264 A57E81D3 A 277 mov R8, SOFH 00FF0268 A55E8007 A 278 anl R8, #07h ; Only the bottom three bits count 00FF026C A59E44 0001 A 279 sub WR8, #1 00FF0271 A57A91F3 A 280 mov TXDAT, R9 00FF0275 A57A81F3 A 281 mov TXDAT, R8 00FF0279 A57E83 D80C A 282 mov R8, ISO_out_err 00FF027E A57A81F3 A 283 mov TXDAT, R8 A 284 00FF0282 75F603 A 285 mov TXCNTL, #3 ; Sending three bytes A 286 A 287 00FF0285 A 288 report_exit: 00FF0285 D0F1 A 289 pop EPINDEX 00FF0287 A57E8000 A 290 mov R8, #0 00FF028B A57A83 D80C A 291 mov ISO_out_err,R8 ; Always clear ISO_out_err A 292 00FF0290 02 01D0 A 293 jmp SOF_ISR_exit A 294 ;;; SPecial test stuff A 295 ; report_exit1: A 296 ; mov R7, ISO_out_err A 297 ; mov P1,R7 A 298 ; jmp $ A 299 ;;; A 300 ;------------------------------------------------------------------ A 301 ;; This routine checks the state of the currently selected FIFO. A 302 ;; If it is not empty, then it takes out one packet, and marks A 303 ;; the EP as running. If it is empty, and it was previously A 304 ;; running, then it marks the EP as not running, and sets the A 305 ;; appropriate bit in ISO_out_err. A 306 ;------------------------------------------------------------------ 00FF0293 A 307 handle_ISO_OUT: PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 17 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0293 A5CA7B A 308 push DR28 A 309 A 310 ;; First get DR28 to be pointing to the appropriate EPrunning A 311 ;; variable. It is needed in several places. 00FF0296 A57EE4 0000 A 312 mov WR28,#0 ; Access in page 00h 00FF029B A57EF4 D808 A 313 mov WR30,#LOW16(EP1running)-1; Offset of EP1running var minus 1 A 314 ; We add EPINDEX to it to get A 315 ; the proper offset 00FF02A0 A57E34 0000 A 316 mov WR6, #0 00FF02A5 AFF1 A 317 mov R7, EPINDEX 00FF02A7 A52DF3 A 318 add WR30, WR6 A 319 00FF02AA AFE5 A 320 mov R7, RXFLG ; Get the receive flags 00FF02AC A55E70C0 A 321 anl R7, #0C0h ; Mask of to RXFIF bits only 00FF02B0 A568 1B A 322 je hio_not_running ; and if so jump to handle this A 323 A 324 ;; If we get here, then there was something in the FIFO. We need A 325 ;; to empty the FIFO, and then mark the EP as running. Let's mark A 326 ;; the EP as running first. A 327 00FF02B3 7F01 A 328 mov R7, #1 00FF02B5 A57A7B70 A 329 mov @DR28, R7 A 330 A 331 ;; Now empty the FIFO 00FF02B9 AFE6 A 332 mov R7, RXCNTL 00FF02BB A5BE7000 A 333 cmp R7, #0 00FF02BF A568 06 A 334 je hio_done_with_fifo ; If it was a zero length packet then done A 335 00FF02C2 A 336 hio_empty_fifo: 00FF02C2 A57E81E3 A 337 mov R8, RXDAT 00FF02C6 DF FA A 338 djnz R7, hio_empty_fifo A 339 00FF02C8 A 340 hio_done_with_fifo: 00FF02C8 A5A9D4E4 A 341 setb RXFFRC ; Mark the read as complete 00FF02CC 80 30 A 342 jmp hio_return A 343 00FF02CE A 344 hio_not_running: A 345 ;; We get here if we discover that the FIFO is empty. If the A 346 ;; EP was previously running, this is a problem and should be A 347 ;; marked in ISO_out_err. Otherwise it is normal A 348 A 349 ;; DR28 holds the address the correnct EPrunning variable A 350 ;; Check to see if it was previously running A 351 00FF02CE A57E7B80 A 352 mov R8, @DR28 00FF02D2 A5BE8000 A 353 cmp R8, #0 00FF02D6 A568 25 A 354 je hio_return A 355 A 356 ;;; A 357 ; mov WR6, WR30 A 358 ; mov P1,R6 A 359 ; jmp $ PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 18 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 360 ;;; A 361 ;; If we get there, then the EP was previously running, so there A 362 ;; was a gap. Reset the EPrunning variable, and set the appropriate A 363 ;; bit in ISO_out_err 00FF02D9 7F00 A 364 mov R7, #0 00FF02DB A57A7B70 A 365 mov @DR28, R7 A 366 A 367 ;; We can directly OR in EPINDEX if it isn't equal to 3 00FF02DF A57E73 D80C A 368 mov R7, ISO_out_err 00FF02E4 A57E81F1 A 369 mov R8, EPINDEX 00FF02E8 A5BE8003 A 370 cmp R8, #3 00FF02EC A568 06 A 371 je hio_EP3 A 372 A 373 ;; Directly OR it in 00FF02EF A54E71F1 A 374 orl R7, EPINDEX 00FF02F3 80 04 A 375 jmp hio_seterr A 376 00FF02F5 A 377 hio_EP3: 00FF02F5 A54E7004 A 378 orl R7, #4 ; If EPINDEX is = 3, then set bit 2 00FF02F9 A 379 hio_seterr: 00FF02F9 A57A73 D80C A 380 mov ISO_out_err, R7 A 381 00FF02FE A 382 hio_return: 00FF02FE A5DA7B A 383 pop DR28 00FF0301 22 A 384 ret A 385 ;------------------------------------------------------------------ A 386 ;------------------------------------------------------------------ 00FF0302 A 387 RWK_ISR: 00FF0302 759020 A 388 MOV P1, #20h ; clear Suspend LED 00FF0305 32 A 389 reti A 390 00FF0306 A 391 Sus_ISR: 00FF0306 A5A921DF 15 A 392 jb GRSM, Resume_l ; 00FF030B 759008 A 393 MOV P1, #08h ; set LED for Suspend 00FF030E A5A9D187 A 394 setb PD ; set Powerdown Mode bit to meet 500uA. A 395 00FF0312 A5A921DF 09 A 396 jb GRSM,Resume_l ; jump if GRSM flag. 00FF0317 A5A9D2DF A 397 setb RWU ; Set remote_wakeup bit. 00FF031B A5A9C0DF A 398 clr GSUS ; Clear the suspend bit. 00FF031F 32 A 399 reti A 400 00FF0320 A 401 Resume_l: A 402 ; jb GSUS, Sus_ISR ; 00FF0320 A5A9C1DF A 403 clr GRSM ; Clear Resume bit 00FF0324 759020 A 404 MOV P1, #20h ; reset Suspend LED, turn on resume LED 00FF0327 32 A 405 reti A 406 A 407 A 408 COMMENT *------------------------------------------------------------ A 409 Function name : ActiveLoop A 410 Brief Description : Monitors RX and TX on all EPs A 411 Regs preserved : No reg. is saved PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 19 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 412 --------------------------------------------------------------------* A 413 SCOPE 00FF0328 A 414 ActiveLoop: A 415 ; jb GRSM, resume_l ; jump if Global Resume flag. A 416 ; jb GSUS, pw_down ; jump if Global Suspend flag. A 417 A 418 ; mov R8, SOFH A 419 ; mov P1, R8 A 420 ; clr SOFH.6 A 421 00FF0328 A 422 EP0_RX: 00FF0328 30C1 06 A 423 jnb FRXD0, EP0_TX 00FF032B 75F100 A 424 mov EPINDEX, #0 00FF032E 12 033D A 425 lCall OUT_TOKEN1 ; 82930 has received a packet from HC A 426 00FF0331 A 427 EP0_TX: 00FF0331 30C0 06 A 428 jnb FTXD0, EP1_RX 00FF0334 75F100 A 429 mov EPINDEX, #0 00FF0337 12 0397 A 430 lCall IN_TOKEN ; 82930 has sent a packet to HC 00FF033A A 431 EP1_RX: A 432 ; jnb FRXD1, EP1_TX A 433 ; mov EPINDEX, #1 A 434 ; lCall ServiceEP1RX A 435 ; lCall PrimeEP1Fifo A 436 00FF033A A 437 EP1_TX: A 438 ; jnb FTXD1, EP2_RX A 439 ; mov EPINDEX, #1 A 440 ; lCall ServiceEP1TX A 441 00FF033A A 442 EP2_RX: A 443 ; jnb FRXD2, EP2_TX A 444 ; mov EPINDEX, #2 A 445 ; lCall ServiceEP2RX A 446 ; lCall PrimeEP2Fifo A 447 00FF033A A 448 EP2_TX: A 449 ; jnb FTXD2, EP3_RX A 450 ; mov EPINDEX, #2 A 451 ; lCall ServiceEP2TX A 452 00FF033A A 453 EP3_RX: A 454 ; jnb FRXD3, EP3_TX A 455 ; mov EPINDEX, #3 A 456 ; lCall ServiceEP3RX A 457 ; lCall PrimeEP3Fifo A 458 00FF033A A 459 EP3_TX: A 460 ; jnb FTXD3, EP_Done A 461 ; mov EPINDEX, #3 A 462 ; lCall ServiceEP3TX A 463 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 20 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF033A A 464 EP_Done: 00FF033A 02 0328 A 465 ljmp ActiveLoop A 466 A 467 SCOPE A 468 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< A 469 ; This is the block that services EP0 events. A 470 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< A 471 ;####################### FAKE INTERUPT ROUTINE ####################### A 472 ; A 473 ; SetupSeq Meaning A 474 ; 0 No Setup command pending. Any out received is treated as a A 475 ; DeviceRequest. Later steppings will actually detect a SETUP A 476 ; packet and set a status flag telling us SETUP was received. A 477 ; A 478 ; 1 DeviceRequest Received, Processing Get Request. An IN Will A 479 ; transfer data. An Out will end the transfer and set A 480 ; SetupSeq to 0 A 481 ; A 482 ; 2 DeviceRequest Received, Processing Set Request. An OUT Will A 483 ; transfer data to the buffer. An IN will end the transfer and A 484 ; set SetupSeq to 0 A 485 ; A 486 ; 3 Done bit SetRequest. Ignore all data sent until an IN A 487 ; Used for Set Address A 488 A 489 ; This block of code deals with Endpoint 0 getting a transmit event interrupt. A 490 00FF033D A 491 OUT_TOKEN1: A 492 00FF033D 53C0FD A 493 anl FIFLG, #EP0_RX_CLR ; Clear the interrupt bit. A 494 A 495 ;Check sequence bit for the state that we are in. 00FF0340 A57EE4 0000 A 496 mov WR28, #00 ; point to page 00 00FF0345 A57EF4 9000 A 497 mov WR30, #LOW16(SetupSeq) 00FF034A A57E7BB0 A 498 mov R11, @DR28 00FF034E A5BEB000 A 499 cmp R11, #0 ; Is this a setup packet?? 00FF0352 A578 06 A 500 jne ?l1 ; If not, then deal with the data phase. 00FF0355 12 03D7 A 501 lcall SETUP_TOKEN ; If yes, then parse the setup command. 00FF0358 02 0396 A 502 ljmp ?lx ; Return to caller. A 503 A 504 ; If this is not a setup command then it must be one of two things A 505 ; 0 or more data packets for a set command (Seq=2) or an A 506 ; status result if Seq=1 A 507 00FF035B A5BEB001 A 508 ?l1: cmp R11, #1 ; Is this the status phase of a "GET" command? 00FF035F A578 1B A 509 jne ?l2 ; No, so check next 00FF0362 A5A9D4E4 A 510 SETB RXCON0.4 ;Update receive FIFO state 00FF0366 A5A9D7F4 A 511 SETB TXCON0.7 ;Flush the Transmit FIFOS 00FF036A A5A9C1E1 A 512 CLR EPCON0.1 ;disable Tx Output on EP0. Respond to "IN" A 513 ;with "NAK" 00FF036E A57EF4 9000 A 514 mov WR30,#LOW16(SetupSeq) ;Update the state machine-Expect a setup token 00FF0373 A57EB000 A 515 mov r11,#0 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 21 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0377 A57A7BB0 A 516 mov @DR28, R11 00FF037B 80 19 A 517 sjmp ?lx A 518 A 519 ;jb RXSTAT0.6, ?l1 ; If not SETUP then must be a standard out A 520 00FF037D A5BEB002 A 521 ?l2: cmp R11, #2 ; Are we processing a Control Write, i.e. Set Descr... 00FF0381 A578 05 A 522 jne ?l3 00FF0384 12 06C9 A 523 lcall OUT_TOKEN ; If we are continue to read in the data. 00FF0387 80 0D A 524 SJMP ?lx A 525 00FF0389 A5BEB003 A 526 ?l3: cmp R11, #3 ;If 3, then we are done setting the address and A 527 ;all outs are to be ignored until an IN terminates A 528 ;the control transfer 00FF038D A578 06 A 529 jne ?l4 00FF0390 A5A9D4E4 A 530 SETB RXCON0.4 ;Clear the receive FIFO 00FF0394 80 00 A 531 sjmp ?lx A 532 00FF0396 A 533 ?l4: A 534 00FF0396 22 A 535 ?lx: ret A 536 A 537 A 538 A 539 SCOPE A 540 ;##################################################################### A 541 ;#################### IN TOKEN ###################################### A 542 ;##################################################################### A 543 ; SetupSeq Meaning A 544 ; 0 No Setup command pending. Any out received is a DeviceRequest A 545 ; A 546 ; 1 DeviceRequest Received, Processing Get Request. An IN Will A 547 ; transfer data. An Out will end the transfer and set A 548 ; SetupSeq to 0 A 549 ; A 550 ; 2 DeviceRequest Received, Processing Set Request. An OUT Will A 551 ; transfer data to the buffer. An IN will end the transfer and A 552 ; set SetupSeq to 0 A 553 ; A 554 ; 3 Done SetADDRESS Request. Ignore all data sent until an IN A 555 ; Used for Set Address A 556 ; A 557 ; A 558 ; For in tokens we can do 2 things. A 559 ; A 560 ; If SetupSeq = 2,3 then a IN will terminate the control transfer. A 561 A 562 A 563 SCOPE 00FF0397 A 564 IN_TOKEN: 00FF0397 53C0FE A 565 anl FIFLG, #EP0_TX_CLR ; clear the interrupt bit 00FF039A A57EB3 9000 A 566 mov R11, 00:SetupSeq ; read state variable 00FF039F A5BEB002 A 567 cmp R11, #02h ; Should this be the end to a setup sequence? PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 22 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF03A3 A578 0B A 568 jne InTokenCheckSA ; If no,check for end of set address A 569 00FF03A6 A 570 ?StatusPhaseDone: 00FF03A6 A57EB000 A 571 mov R11, #00h 00FF03AA A57AB3 9000 A 572 mov 00:SetupSeq, R11 ; Set state var. to expect setup. 00FF03AF 80 25 A 573 jmp ?Return A 574 00FF03B1 A 575 InTokenCheckSA: 00FF03B1 A5BEB003 A 576 cmp R11, #03h ; Prev. Setup was SetAddress??? 00FF03B5 A578 14 A 577 jne ?SendDataBack 00FF03B8 A57EA3 9001 A 578 mov R10, 00:new_addr 00FF03BD A57AA18F A 579 mov FADDR, R10 00FF03C1 A57EB000 A 580 mov R11, #00h 00FF03C5 A57AB3 9000 A 581 mov 00:SetupSeq, R11 00FF03CA 80 0A A 582 jmp ?Return A 583 00FF03CC A 584 ?SendDataBack: 00FF03CC A5BEB001 A 585 cmp R11, #01h 00FF03D0 A578 03 A 586 jne ?Return A 587 00FF03D3 12 0A1E A 588 lCall DoControlOutput A 589 00FF03D6 A 590 ?Return: 00FF03D6 22 A 591 Ret A 592 A 593 SCOPE A 594 A 595 ;***************** SETUP_TOKEN ************************* A 596 ;***** Gets and saves SETUP DATA ************************ A 597 ;****************************************************** A 598 A 599 ;Procedure that takes SETUP data from the FIFO, Puts it in memory A 600 ;and then updates writes it to the fifo. 00FF03D7 A 601 SETUP_TOKEN: 00FF03D7 A57EE4 0000 A 602 MOV WR28, #0 ; USE DR28 for our data pointer 00FF03DC A57EF4 9100 A 603 mov WR30, #LOW16(COMMAND_BUFFER) 00FF03E1 A57E81E6 A 604 mov R8, RXCNT0 ; Use R8 for our count register 00FF03E5 A57A7B80 A 605 mov @DR28, R8 ; Store the count in the buffer 00FF03E9 A52EF4 0001 A 606 add WR30, #1 ; Increment mem pointer 00FF03EE A54C88 A 607 orl R8, R8 ; Set flags 00FF03F1 A568 22 A 608 je ?k2 ; Zero length SETUP, error out.... A 609 ;(KLS) 00FF03F4 A5A9C4E2 A 610 clr EDOVW ; Release the SETUP Fifo to be read. A 611 ; Read FIFO loop 00FF03F8 A57EB1E3 A 612 ?k1: mov R11, RXDAT0 ; Read byte from FIFO into R11 00FF03FC A57A7BB0 A 613 mov @DR28, R11 ; Store it in the buffer 00FF0400 A52EF4 0001 A 614 ADD WR30, #1 ; Increment the pointer 00FF0405 A59E8001 A 615 sub R8, #1 ; Decrement the counter 00FF0409 A578 EC A 616 jne ?k1 ; Read until FIFO empty A 617 00FF040C A5A9D4E4 A 618 setb RXCON0.4 ; Set FFRC bit to update RX FIFO state A 619 ;(KLS) PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 23 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0410 A5A9C6E2 A 620 clr RXSETUP ; Release the FIFO to no longer NAK data. 00FF0414 80 07 A 621 sjmp PROCESS_SETUP A 622 00FF0416 A 623 ?k2: ;Should never get a zero length setup. 00FF0416 A5A9D4E4 A 624 setb RXCON0.4 ;Clear the fifo 00FF041A 02 06C8 A 625 LJMP EXIT_SETUP ;leave. A 626 SCOPE A 627 A 628 ;***************** PROCESS_SETUP ********************** A 629 ;***** PROCESS THE SETUP ****************************** A 630 ;****************************************************** A 631 SCOPE 00FF041D A 632 PROCESS_SETUP: A 633 A 634 ;Compare bmRequest Type A 635 ;If it's it 1xxxxxxb - Get Descriptor/Get Configuration A 636 ;If it's it 0xxxxxxb - Set Address/Configuration/Set Feature/Clear Feature. A 637 00FF041D A57EE4 0000 A 638 mov WR28, #0 00FF0422 A57EF4 9101 A 639 mov WR30, #LOW16(bmRequestType) 00FF0427 A57E7BB0 A 640 mov R11, @DR28 A 641 00FF042B A55EB080 A 642 anl R11, #80h; Get/Set ?? 00FF042F A578 03 A 643 jne DO_GET_COMMAND A 644 00FF0432 02 04A7 A 645 LJMP DO_SET_COMMAND A 646 A 647 ;=================================================== A 648 ; Routines to process a get descriptor/configuration A 649 ;=================================================== A 650 00FF0435 A 651 DO_GET_COMMAND: ;Is this a get_config or a Get_Descrip. 00FF0435 A57EF4 9102 A 652 mov WR30, #LOW16(bRequest) 00FF043A A57E7BB0 A 653 mov R11, @DR28 00FF043E A5BEB006 A 654 cmp R11, #GET_DESCRIPTOR 00FF0442 A578 03 A 655 jne CheckGetConfig 00FF0445 02 066E A 656 ljmp GET_DESCR_Request ;Go get Descriptor (Device & Config) A 657 00FF0448 A 658 CheckGetConfig: 00FF0448 A5BEB008 A 659 cmp R11, #GET_CONFIGURATION 00FF044C A578 03 A 660 jne CheckGetStatus 00FF044F 02 06C8 A 661 ljmp GET_CONFIG_Request ;Go get config request A 662 A 663 ; code for other types of bRequests 00FF0452 A 664 CheckGetStatus: 00FF0452 A5BEB000 A 665 cmp R11, #GET_STATUS 00FF0456 A578 37 A 666 jne CheckGetInterface 00FF0459 A57E67 9105 A 667 mov WR12, wIndex A 668 SWAP_BYTES R12,R13,R14 00FF045E A57CEC A+ 668 mov R14, R12 00FF0461 A57CCD A+ 668 mov R12, R13 00FF0464 A57CDE A+ 668 mov R13, R14 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 24 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A+ 668 ENDMAC SWAP_BYTES 00FF0467 A5CA69 A 669 push WR12 ;wIndex 00FF046A A57EC3 9101 A 670 mov R12, bmRequestType 00FF046F A5CAC8 A 671 push R12 ;bmRequestType A 672 A 673 ; lCall _GetStatus ;Go get status 00FF0472 A59EF8 0003 A 674 sub SPX, #03h A 675 ; WR0 contains the result returned from GetStatus A 676 ; need to swap the bytes to make it little endian for the bus A 677 SWAP_BYTES R0, R1, R2 00FF0477 A57C20 A+ 677 mov R2, R0 00FF047A A57C01 A+ 677 mov R0, R1 00FF047D A57C12 A+ 677 mov R1, R2 A+ 677 ENDMAC SWAP_BYTES A 678 00FF0480 7A01 A 679 mov R2, #01h 00FF0482 A57A23 9000 A 680 mov SetupSeq , R2 ;Advance State Machine to next state A 681 00FF0487 12 0A06 A 682 lCall SetStatusData 00FF048A 12 0A1E A 683 lCall DoControlOutput ;primes fifo A 684 00FF048D 02 06C8 A 685 ljmp EXIT_SETUP A 686 00FF0490 A 687 CheckGetInterface: 00FF0490 A5BEB00A A 688 cmp R11, #GET_INTERFACE 00FF0494 A578 03 A 689 jne CheckSynchFrame 00FF0497 02 06C8 A 690 ljmp GET_CONFIG_Request ;Go get config request A 691 00FF049A A 692 CheckSynchFrame: 00FF049A A5BEB00C A 693 cmp R11, #SYCH_FRAME 00FF049E A578 03 A 694 jne GetCommandExit 00FF04A1 02 06C8 A 695 ljmp GET_CONFIG_Request ;Go get config request A 696 00FF04A4 A 697 GetCommandExit: 00FF04A4 02 06C8 A 698 ljmp EXIT_SETUP A 699 A 700 A 701 A 702 ;=================================================== A 703 ; Routines to process a set descriptor/configuration A 704 ;=================================================== A 705 00FF04A7 A 706 DO_SET_COMMAND: 00FF04A7 A57EF4 9102 A 707 mov WR30, #LOW16(bRequest) 00FF04AC A57E7BB0 A 708 mov R11, @DR28 A 709 00FF04B0 A5BEB007 A 710 cmp R11, #SET_DESCRIPTOR ; Was this a Set_Descriptor? 00FF04B4 A578 02 A 711 jne ?CheckSetConfig 00FF04B7 80 32 A 712 jmp DO_SET_DESCRIPTOR A 713 00FF04B9 A 714 ?CheckSetConfig: 00FF04B9 A5BEB009 A 715 cmp R11, #SET_CONFIGURATION ; Was this a Set_Configuration? PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 25 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF04BD A578 02 A 716 jne ?CheckSetInterface 00FF04C0 80 2B A 717 jmp DO_SET_CONFIGURATION A 718 00FF04C2 A 719 ?CheckSetInterface: 00FF04C2 A5BEB00B A 720 cmp R11, #SET_INTERFACE ; Was this a Set_Interface? 00FF04C6 A578 02 A 721 jne ?CheckClearFeature 00FF04C9 80 24 A 722 jmp DO_SET_INTERFACE A 723 00FF04CB A 724 ?CheckClearFeature: 00FF04CB A5BEB001 A 725 cmp R11, #CLEAR_FEATURE 00FF04CF A578 03 A 726 jne ?CheckSetAddress 00FF04D2 02 05D2 A 727 jmp DO_CLEAR_FEATURE A 728 00FF04D5 A 729 ?CheckSetAddress: 00FF04D5 A5BEB005 A 730 cmp R11, #SET_ADDRESS ; Was this a Set_Address? 00FF04D9 A578 03 A 731 jne ?CheckSetFeature 00FF04DC 02 0641 A 732 jmp DO_SET_ADDRESS A 733 00FF04DF A 734 ?CheckSetFeature: 00FF04DF A5BEB003 A 735 cmp R11, #SET_FEATURE ; Was this a Set_Feature? 00FF04E3 A578 03 A 736 jne ?CheckExit 00FF04E6 02 0603 A 737 jmp DO_SET_FEATURE A 738 00FF04E9 A 739 ?CheckExit: 00FF04E9 C1 62 A 740 ajmp DO_SET_COMMAND_EXIT A 741 00FF04EB A 742 DO_SET_DESCRIPTOR: A 743 ; 00FF04EB C1 62 A 744 ajmp DO_SET_COMMAND_EXIT A 745 00FF04ED A 746 DO_SET_CONFIGURATION: A 747 ; 00FF04ED C1 62 A 748 ajmp DO_SET_COMMAND_EXIT A 749 00FF04EF A 750 DO_SET_INTERFACE: A 751 ; A 752 ;###################################################################### A 753 ;; This stuff was originally here to call into C. It doesn't A 754 ;; work easily so it is booted A 755 ;###################################################################### A 756 ; push DR28 ; These push'es are here to protect what A 757 ; push WR26 ; gets used by the C-code that is called A 758 ; push WR14 ; below A 759 ; A 760 ; mov WR12, wIndex A 761 ; SWAP_BYTES R12, R13, R14 A 762 ; push WR12 A 763 ; A 764 ; mov WR12, wValue A 765 ; SWAP_BYTES R12, R13, R14 A 766 ; push WR12 A 767 ; PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 26 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 768 ; lCall _SetInterface A 769 ; sub SPX, #04h A 770 ; A 771 ; pop WR14 A 772 ; pop WR26 A 773 ; pop DR28 A 774 ;###################################################################### A 775 ;###################################################################### A 776 00FF04EF A57E67 9103 A 777 mov WR12, wValue ; Loads the 'word' value R12 actually holds A 778 ; what we want A 779 A 780 ;????????? A 781 ; SPecial test code here. 00FF04F4 A57AC3 D80D A 782 mov TestVal, R12 00FF04F9 A5CA78 A 783 push R7 00FF04FC C0F1 A 784 push EPINDEX 00FF04FE 75F103 A 785 mov EPINDEX, #3 00FF0501 AFF5 A 786 mov R7, TXFLG 00FF0503 A55E70C0 A 787 anl R7, #0c0h 00FF0507 A51E70 A 788 srl R7 00FF050A A51E70 A 789 srl R7 00FF050D 8F90 A 790 mov P1, R7 00FF050F D0F1 A 791 pop EPINDEX 00FF0511 A5DA78 A 792 pop R7 00FF0514 02 05C3 A 793 jmp SI_leave1 A 794 ;????????? A 795 00FF0517 A5BEC000 A 796 cmp R12,#0 00FF051B A578 15 A 797 jne ?SI1 A 798 00FF051E A57E8008 A 799 mov R8, #8 ; Alt setting 0 - MPS1=8 MPS2=8 00FF0522 A57A83 D806 A 800 mov _gbMPSEndPoint1,R8 00FF0527 A57E8008 A 801 mov R8, #8 00FF052B A57A83 D807 A 802 mov _gbMPSEndPoint2,R8 00FF0530 02 05B8 A 803 jmp SI_leave A 804 00FF0533 A5BEC001 A 805 ?SI1: cmp R12,#1 00FF0537 A578 14 A 806 jne ?SI2 A 807 00FF053A A57E8020 A 808 mov R8, #32 ; Alt setting 1 - MPS1=32 MPS2=4 00FF053E A57A83 D806 A 809 mov _gbMPSEndPoint1,R8 00FF0543 A57E8004 A 810 mov R8, #4 00FF0547 A57A83 D807 A 811 mov _gbMPSEndPoint2,R8 00FF054C 80 6A A 812 jmp SI_leave A 813 00FF054E A5BEC002 A 814 ?SI2: cmp R12,#2 00FF0552 A578 14 A 815 jne ?SI3 A 816 00FF0555 A57E8040 A 817 mov R8, #64 ; Alt setting 2 - MPS1=64 MPS2=2 00FF0559 A57A83 D806 A 818 mov _gbMPSEndPoint1,R8 00FF055E A57E8002 A 819 mov R8, #2 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 27 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0562 A57A83 D807 A 820 mov _gbMPSEndPoint2,R8 00FF0567 80 4F A 821 jmp SI_leave A 822 00FF0569 A5BEC003 A 823 ?SI3: cmp R12,#3 00FF056D A578 14 A 824 jne ?SI4 A 825 00FF0570 A57E8080 A 826 mov R8, #128 ; Alt setting 3 - MPS1=128 MPS2=1 00FF0574 A57A83 D806 A 827 mov _gbMPSEndPoint1,R8 00FF0579 A57E8001 A 828 mov R8, #1 00FF057D A57A83 D807 A 829 mov _gbMPSEndPoint2,R8 00FF0582 80 34 A 830 jmp SI_leave A 831 00FF0584 A5BEC004 A 832 ?SI4: cmp R12,#4 00FF0588 A578 14 A 833 jne ?SI5 A 834 00FF058B A57E8035 A 835 mov R8, #53 ; Alt setting 4 - MPS1=53 MPS2=3 00FF058F A57A83 D806 A 836 mov _gbMPSEndPoint1,R8 00FF0594 A57E8003 A 837 mov R8, #3 00FF0598 A57A83 D807 A 838 mov _gbMPSEndPoint2,R8 00FF059D 80 19 A 839 jmp SI_leave A 840 00FF059F A5BEC005 A 841 ?SI5: cmp R12,#5 00FF05A3 A578 12 A 842 jne SI_leave A 843 00FF05A6 A57E8067 A 844 mov R8, #103 ; Alt setting 5 - MPS1=103 MPS2=7 00FF05AA A57A83 D806 A 845 mov _gbMPSEndPoint1,R8 00FF05AF A57E8007 A 846 mov R8, #7 00FF05B3 A57A83 D807 A 847 mov _gbMPSEndPoint2,R8 A 848 00FF05B8 A 849 SI_leave: 00FF05B8 A5A9C5D3 A 850 clr SOFIE ; Disable SOF interrupts A 851 00FF05BC 12 01DC A 852 call _SOF_Init_FIFOs ; Set the FIFOs back to startup A 853 00FF05BF A5A9D5D3 A 854 setb SOFIE ; Enable SOF interrupts A 855 00FF05C3 A 856 SI_leave1: 00FF05C3 A57EF4 9000 A 857 mov WR30, #LOW16(SetupSeq) 00FF05C8 A57EA002 A 858 mov R10, #2 ; This was a Set with do data phase. 00FF05CC A57A7BA0 A 859 mov @DR28, R10 ;Set state to look for status phase. A 860 00FF05D0 C1 62 A 861 ajmp DO_SET_COMMAND_EXIT A 862 00FF05D2 A 863 DO_CLEAR_FEATURE: 00FF05D2 A57E67 9105 A 864 mov WR12, wIndex A 865 SWAP_BYTES R12, R13, R14 00FF05D7 A57CEC A+ 865 mov R14, R12 00FF05DA A57CCD A+ 865 mov R12, R13 00FF05DD A57CDE A+ 865 mov R13, R14 A+ 865 ENDMAC SWAP_BYTES 00FF05E0 A5CA69 A 866 push WR12 A 867 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 28 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF05E3 A57E67 9103 A 868 mov WR12, wValue A 869 SWAP_BYTES R12, R13, R14 00FF05E8 A57CEC A+ 869 mov R14, R12 00FF05EB A57CCD A+ 869 mov R12, R13 00FF05EE A57CDE A+ 869 mov R13, R14 A+ 869 ENDMAC SWAP_BYTES 00FF05F1 A5CA69 A 870 push WR12 A 871 00FF05F4 A57EC3 9101 A 872 mov R12, bmRequestType 00FF05F9 A5CAC8 A 873 push R12 A 874 ; LCall _ClearFeature 00FF05FC A59EF8 0005 A 875 sub SPX, #05h A 876 00FF0601 80 5F A 877 jmp DO_SET_COMMAND_EXIT A 878 00FF0603 A 879 DO_SET_FEATURE: 00FF0603 A57E67 9105 A 880 mov WR12, wIndex A 881 SWAP_BYTES R12, R13, R14 00FF0608 A57CEC A+ 881 mov R14, R12 00FF060B A57CCD A+ 881 mov R12, R13 00FF060E A57CDE A+ 881 mov R13, R14 A+ 881 ENDMAC SWAP_BYTES 00FF0611 A5CA69 A 882 push WR12 A 883 00FF0614 A57E67 9103 A 884 mov WR12, wValue A 885 SWAP_BYTES R12, R13, R14 00FF0619 A57CEC A+ 885 mov R14, R12 00FF061C A57CCD A+ 885 mov R12, R13 00FF061F A57CDE A+ 885 mov R13, R14 A+ 885 ENDMAC SWAP_BYTES 00FF0622 A5CA69 A 886 push WR12 A 887 00FF0625 A57EC3 9101 A 888 mov R12, bmRequestType 00FF062A A5CAC8 A 889 push R12 A 890 ; LCall _SetFeature 00FF062D A59EF8 0005 A 891 sub SPX, #05h A 892 00FF0632 A57EF4 9000 A 893 mov WR30, #LOW16(SetupSeq) 00FF0637 A57EA002 A 894 mov R10, #2 ; This was a Set Address command. 00FF063B A57A7BA0 A 895 mov @DR28, R10 ;Set state to look for status phase. A 896 00FF063F 80 21 A 897 jmp DO_SET_COMMAND_EXIT A 898 00FF0641 A 899 DO_SET_ADDRESS: 00FF0641 A57EF4 9103 A 900 mov WR30, #LOW16(wValue) ; Get the address from wValue and store it. 00FF0646 A50B7A40 A 901 mov WR8, @DR28 ; It doesn't actually get changed until the 00FF064A A57EF4 9001 A 902 mov WR30, #LOW16(new_addr) ;status phase completes successfully. 00FF064F A57A7B80 A 903 mov @DR28, R8 00FF0653 A57EF4 9000 A 904 mov WR30, #LOW16(SetupSeq) 00FF0658 A57EA003 A 905 mov R10, #3 ; This was a Set Address command. 00FF065C A57A7BA0 A 906 mov @DR28, R10 ;Set state to look for status phase. 00FF0660 C1 62 A 907 ajmp DO_SET_COMMAND_EXIT PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 29 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 908 00FF0662 A 909 DO_SET_COMMAND_EXIT: A 910 00FF0662 75F100 A 911 mov EPINDEX, #0 00FF0665 75F600 A 912 mov TXCNT0, #0 ; Prime FIFO for response to status phase 00FF0668 A5A9D1E1 A 913 setb EPCON0.1 ; Set the Tx output enable bit. 00FF066C C1 C8 A 914 ajmp EXIT_SETUP A 915 A 916 A 917 ; ********************** GET DESCRIPTOR ******************* 00FF066E A 918 GET_DESCR_Request: A 919 00FF066E A57EF4 9103 A 920 mov WR30, #LOW16(wValue) 00FF0673 A50B7A50 A 921 mov WR10, @DR28 00FF0677 A5BEB001 A 922 cmp R11, #DEVICE_DESCR ;Low Byte in Rll 00FF067B A578 20 A 923 jne ?c1 A 924 A 925 A 926 ; ********************** GET DESCRIPTOR, DEVICE ******************* A 927 00FF067E A57EF4 9000 A 928 mov WR30, #LOW16(SetupSeq) ;Advance State Machine to next state 00FF0683 A57EA001 A 929 mov R10, #1 ;Set state to doing a "GET" command 00FF0687 A57A7BA0 A 930 mov @DR28, R10 ; A 931 00FF068B A57EE4 00FF A 932 mov WR28, #0ffh; ; Located in ROM->Page=0ff 00FF0690 A57EF4 0AE2 A 933 mov WR30, #LOW16(DEVICE_DESCRIPTOR); 00FF0695 12 09BC A 934 LCALL BufferControlData 00FF0698 12 0A1E A 935 LCALL DoControlOutput 00FF069B 02 06C8 A 936 ljmp EXIT_SETUP A 937 A 938 00FF069E A5BEB002 A 939 ?c1: cmp R11, #CONFIG_DESCR 00FF06A2 A578 20 A 940 jne ?c2 A 941 ; ********************** GET DESCRIPTOR, CONFIGURATION ************ A 942 00FF06A5 A57EF4 9000 A 943 mov WR30, #LOW16(SetupSeq) ;Update state machine 00FF06AA A57EA001 A 944 mov R10, #1 00FF06AE A57A7BA0 A 945 mov @DR28, R10 A 946 00FF06B2 A57EE4 00FF A 947 mov WR28, #0ffh; ;Located in ROM 00FF06B7 A57EF4 0AF5 A 948 mov WR30, #LOW16(CONFIGURATION_DESCRIPTOR); 00FF06BC 12 09BC A 949 LCALL BufferControlData 00FF06BF 12 0A1E A 950 LCALL DoControlOutput A 951 00FF06C2 02 06C8 A 952 ljmp EXIT_SETUP A 953 00FF06C5 A 954 ?c2: 00FF06C5 02 06C8 A 955 ljmp EXIT_SETUP A 956 00FF06C8 A 957 GET_CONFIG_Request: A 958 A 959 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 30 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 960 00FF06C8 A 961 EXIT_SETUP: 00FF06C8 22 A 962 ret A 963 A 964 SCOPE A 965 A 966 A 967 ;***************** OUT_TOKEN ************************* A 968 ;***** Gets and saves OUT DATA ************************ A 969 ;****************************************************** A 970 A 971 ;Program that takes data from the FIFO, Puts it in memory A 972 ;and then updates writes it to the fifo. A 973 A 974 A 975 00FF06C9 A 976 OUT_TOKEN: ; Get the data and place it in the in_buffers 00FF06C9 53C0FD A 977 anl FIFLG, #EP0_RX_CLR ; Clear the bit 00FF06CC A57EC4 0000 A 978 MOV WR24, #0 ; USE DR24 00FF06D1 A57ED4 C000 A 979 mov WR26, #LOW16(OUT_BUFFERS) 00FF06D6 A57E81E6 A 980 mov R8, RXCNT0 ; Read count of bytes rec'd into R8 00FF06DA A57A6B80 A 981 mov @DR24, R8 ; Store the count in the OUT_BUFFERS space. 00FF06DE A52ED4 0001 A 982 add WR26, #1 ; Increment mem pointer 00FF06E3 A54C88 A 983 orl R8, R8 ; Set flags 00FF06E6 A568 12 A 984 je ?k2 A 985 00FF06E9 AFE3 A 986 ?k1: mov R7, RXDAT0 ; Read loop 00FF06EB A57A6B70 A 987 mov @DR24, R7 00FF06EF A52ED4 0001 A 988 ADD WR26, #1 00FF06F4 A59E8001 A 989 sub R8, #1 00FF06F8 A578 EE A 990 jne ?k1 A 991 00FF06FB A5A9D4E4 A 992 ?k2: setb RXCON0.4 ; Clear the fifo A 993 ; We now have the data in the buffer. A 994 ; Transmit it to the xmit fifo 00FF06FF 22 A 995 ret A 996 A 997 COMMENT *------------------------------------------------------------ A 998 Function name : ServiceEP1RX A 999 Brief Description : Copies data recd. on EP 1 and stores the same in A 1000 : a buffer. A 1001 Regs preserved : No reg. is saved A 1002 --------------------------------------------------------------------* A 1003 SCOPE 00FF0700 A 1004 ServiceEP1RX: 00FF0700 53C0F7 A 1005 anl FIFLG, #EP1_RX_CLR ; Clear the interrupt bit 00FF0703 A5A920E2 02 A 1006 jb RXACK, ?GoodReceive ; If R_ACK set then a good reception A 1007 00FF0708 80 58 A 1008 jmp ?Return ; else leave A 1009 00FF070A A 1010 ?GoodReceive: 00FF070A 7E00 A 1011 mov R6, #00h PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 31 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF070C AFE6 A 1012 mov R7, RXCNT1 ; Get the no. of bytes recd. 00FF070E A5BE7000 A 1013 cmp R7, #00h ; Check whether a null data packet was recd. 00FF0712 A568 49 A 1014 je ?NullPacketRecd ; 00FF0715 A57E57 D800 A 1015 mov WR10, _EP1RxPtr ; Get offset of next free location in the buffer 00FF071A A57EF4 D000 A 1016 mov WR30, #EP_1_Buffer ; get address of start of buffer. 00FF071F A52DF5 A 1017 add WR30, WR10 ; get to next free locaion. A 1018 00FF0722 A52D53 A 1019 add WR10, WR6 00FF0725 A55E54 F7FF A 1020 anl WR10, #RINGBUFFMASK ; do modulo 800h rollover 00FF072A A57A57 D800 A 1021 mov _EP1RxPtr, WR10 ; update the RXPtr offset in buffer. A 1022 00FF072F A57E57 D804 A 1023 mov WR10, _EP1DataCount ; get current data count 00FF0734 A52D53 A 1024 add WR10, WR6 ; add no. of bytes recd. 00FF0737 A57A57 D804 A 1025 mov _EP1DataCount, WR10 ; update the data count A 1026 00FF073C A 1027 ?CopyDataToBuffer: 00FF073C A57EC1E3 A 1028 mov R12, RXDAT1 ; Read data from FIFO 00FF0740 A57AF9C0 A 1029 mov @WR30, R12 ; store in data buffer 00FF0744 A50BF4 A 1030 inc WR30, #01h ; incr. ptr into buffer 00FF0747 A55EF4 F7FF A 1031 anl WR30, #RINGBUFFMASK ; do modulo 800h rollover 00FF074C DF EE A 1032 djnz R7, ?CopyDataToBuffer A 1033 00FF074E A 1034 ?ReadyForAnotherRX: 00FF074E A52E54 0400 A 1035 add WR10, #EP1MAXPACKET ; The next packet can ba a max of MPS 00FF0753 A5BE54 07FF A 1036 cmp WR10, #RINGBUFFSIZE ; If this is < than the total buffer sapce, return 00FF0758 40 04 A 1037 jl ?NullPacketRecd A 1038 00FF075A A5A9C3E1 A 1039 clr RXIE ; Set not ready to RX till a enuf space is availab A 1040 00FF075E A 1041 ?NullPacketRecd: 00FF075E A5A9D4E4 A 1042 setb RXFFRC ; signal FIFO read complete to trigger ARM A 1043 ; logic for FIFO management 00FF0762 A 1044 ?Return: 00FF0762 22 A 1045 Ret A 1046 A 1047 COMMENT *------------------------------------------------------------ A 1048 Function name : ServiceEP1TX A 1049 Brief Description : Deals with a transmit event on endpoint 1 It A 1050 : checks to be sure a FIFO is available. It then A 1051 : checks for data availability. If the no. of bytes A 1052 : of data is greater than the MaxPacket size, then A 1053 : MaxPacket bytes are sent. Otherwise all the A 1054 : available data is sent. In either case the data A 1055 : count and TxPtr are adjusted after the move. A 1056 : It can be called as the result of a Tx or an Rx A 1057 : interrupt. If its a Tx interrupt it enters at A 1058 : ServiceEP1TX. If its from an Rx interrupt it A 1059 : enters at PrimeEP1Fifo. A 1060 Regs preserved : No reg. is saved A 1061 --------------------------------------------------------------------* A 1062 SCOPE 00FF0763 A 1063 ServiceEP1TX: PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 32 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0763 53C0FB A 1064 anl FIFLG, #EP1_TX_CLR ; Clear the interrupt bit. A 1065 00FF0766 A 1066 PrimeEP1Fifo: 00FF0766 A5A937F5 07 A 1067 jnb TXFIF1, ?FifoAvailable ; Make sure a fifo is available 00FF076B A5A936F5 02 A 1068 jnb TXFIF0, ?FifoAvailable ; Make sure a fifo is available A 1069 00FF0770 80 72 A 1070 jmp ?Return A 1071 00FF0772 A 1072 ?FifoAvailable: 00FF0772 A57E37 D804 A 1073 mov WR6, _EP1DataCount ; Get data count in WR6 00FF0777 A5BE34 0000 A 1074 cmp WR6, #00h ; is data count == 0? 00FF077C A578 02 A 1075 jne ?Continue A 1076 00FF077F 80 63 A 1077 jmp ?Return A 1078 00FF0781 A 1079 ?Continue: 00FF0781 A5BE34 0400 A 1080 cmp WR6, #EP1MAXPACKET ; cmp with MPS 00FF0786 40 05 A 1081 jl ?LessThanMPS A 1082 00FF0788 A 1083 ?MoreThanMPS: 00FF0788 A57E34 0400 A 1084 mov WR6, #EP1MAXPACKET ; Set NoOfBytes to transfer to MPS A 1085 00FF078D A 1086 ?LessThanMPS: 00FF078D A57E57 D802 A 1087 mov WR10, _EP1TxPtr ; Get offset of first full location A 1088 ; in the endpoint buffer 00FF0792 A57EF4 D000 A 1089 mov WR30, #EP_1_Buffer ; set WR30 back to buffer start 00FF0797 A52DF5 A 1090 add WR30, WR10 ; get to first full location A 1091 00FF079A A52D53 A 1092 add WR10, WR6 00FF079D A55E54 07FF A 1093 anl WR10, #RINGWORDMASK ; do modulo 800h rollover 00FF07A2 A57A57 D802 A 1094 mov _EP1TxPtr, WR10 A 1095 00FF07A7 A57E57 D804 A 1096 mov WR10, _EP1DataCount 00FF07AC A59D53 A 1097 sub WR10, WR6 00FF07AF A57A57 D804 A 1098 mov _EP1DataCount, WR10 A 1099 00FF07B4 A5CA78 A 1100 push R7 00FF07B7 A 1101 ?ArmTXFifo: 00FF07B7 A57EF9C0 A 1102 mov R12, @WR30 ; Read data from buffer 00FF07BB A57AC1F3 A 1103 mov TXDAT1, R12 ; store in Tx FIFO 00FF07BF A50BF4 A 1104 inc WR30, #01h ; inc. the pointer 00FF07C2 A55EF4 F7FF A 1105 anl WR30, #RINGBUFFMASK ; do modulo 800h rollover 00FF07C7 DF EE A 1106 djnz R7, ?ArmTXFifo 00FF07C9 A5DA78 A 1107 pop R7 A 1108 00FF07CC 8FF6 A 1109 mov TXCNT1, R7 ; Write the transmit count A 1110 00FF07CE A 1111 ?ReadyForRX: 00FF07CE A5A923E1 11 A 1112 jb RXIE , ?Return A 1113 00FF07D3 A 1114 ?RXWasDisabled: 00FF07D3 A52E54 0400 A 1115 add WR10, #EP1MAXPACKET ; The next packet can be a max of MPS PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 33 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF07D8 A5BE54 07FF A 1116 cmp WR10, #RINGBUFFSIZE ; If this is > than the total buffer sapce 00FF07DD A538 04 A 1117 jg ?Return ; return A 1118 00FF07E0 A5A9D3E1 A 1119 setb RXIE ; Set ready to RX as enuf buffer space is A 1120 ; now available. 00FF07E4 A 1121 ?Return: 00FF07E4 22 A 1122 Ret A 1123 A 1124 COMMENT *------------------------------------------------------------ A 1125 Function name : ServiceEP2RX A 1126 Brief Description : Copies data recd. on EP 2 and stores the same in A 1127 : a buffer. A 1128 Regs preserved : No reg. is saved A 1129 --------------------------------------------------------------------* A 1130 SCOPE 00FF07E5 A 1131 ServiceEP2RX: 00FF07E5 53C0DF A 1132 anl FIFLG, #EP2_RX_CLR ; Clear the interrupt bit 00FF07E8 A5A920E2 02 A 1133 jb RXACK, ?GoodReceive ; If R_ACK set then a good reception A 1134 00FF07ED 80 58 A 1135 jmp ?Return ; else leave A 1136 00FF07EF A 1137 ?GoodReceive: 00FF07EF 7E00 A 1138 mov R6, #00h 00FF07F1 AFE6 A 1139 mov R7, RXCNT2 ; Get the no. of bytes recd. 00FF07F3 A5BE7000 A 1140 cmp R7, #00h ; Check whether a null data packet was recd. 00FF07F7 A568 49 A 1141 je ?NullPacketRecd ; 00FF07FA A57E57 E800 A 1142 mov WR10, _EP2RxPtr ; Get offset of next free location in the buffer 00FF07FF A57EF4 E000 A 1143 mov WR30, #EP_2_Buffer ; get address of start of buffer. 00FF0804 A52DF5 A 1144 add WR30, WR10 ; get to next free locaion. A 1145 00FF0807 A52D53 A 1146 add WR10, WR6 00FF080A A55E54 F7FF A 1147 anl WR10, #RINGBUFFMASK ; do modulo 800h rollover 00FF080F A57A57 E800 A 1148 mov _EP2RxPtr, WR10 ; update the RXPtr offset in buffer. A 1149 00FF0814 A57E57 E804 A 1150 mov WR10, _EP2DataCount ; get current data count 00FF0819 A52D53 A 1151 add WR10, WR6 ; add no. of bytes recd. 00FF081C A57A57 E804 A 1152 mov _EP2DataCount, WR10 ; update the data count A 1153 00FF0821 A 1154 ?CopyDataToBuffer: 00FF0821 A57EC1E3 A 1155 mov R12, RXDAT2 ; Read data from FIFO 00FF0825 A57AF9C0 A 1156 mov @WR30, R12 ; store in data buffer 00FF0829 A50BF4 A 1157 inc WR30, #01h ; incr. ptr into buffer 00FF082C A55EF4 F7FF A 1158 anl WR30, #RINGBUFFMASK ; do modulo 800h rollover 00FF0831 DF EE A 1159 djnz R7, ?CopyDataToBuffer A 1160 00FF0833 A 1161 ?ReadyForAnotherRX: 00FF0833 A52E54 0008 A 1162 add WR10, #EP2MAXPACKET ; The next packet can ba a max of MPS 00FF0838 A5BE54 07FF A 1163 cmp WR10, #RINGBUFFSIZE ; If this is < than the total buffer sapce, return 00FF083D 40 04 A 1164 jl ?NullPacketRecd A 1165 00FF083F A5A9C3E1 A 1166 clr RXIE ; Set not ready to RX till a enuf space is availab A 1167 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 34 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0843 A 1168 ?NullPacketRecd: 00FF0843 A5A9D4E4 A 1169 setb RXFFRC ; signal FIFO read complete to trigger ARM A 1170 ; logic for FIFO management 00FF0847 A 1171 ?Return: 00FF0847 22 A 1172 Ret A 1173 A 1174 COMMENT *------------------------------------------------------------ A 1175 Function name : ServiceEP2TX A 1176 Brief Description : Deals with a transmit event on endpoint 1 It A 1177 : checks to be sure a FIFO is available. It then A 1178 : checks for data availability. If the no. of bytes A 1179 : of data is greater than the MaxPacket size, then A 1180 : MaxPacket bytes are sent. Otherwise all the A 1181 : available data is sent. In either case the data A 1182 : count and TxPtr are adjusted after the move. A 1183 : It can be called as the result of a Tx or an Rx A 1184 : interrupt. If its a Tx interrupt it enters at A 1185 : ServiceEP2TX. If its from an Rx interrupt it A 1186 : enters at PrimeEP2Fifo. A 1187 Regs preserved : No reg. is saved A 1188 --------------------------------------------------------------------* A 1189 SCOPE 00FF0848 A 1190 ServiceEP2TX: 00FF0848 53C0EF A 1191 anl FIFLG, #EP2_TX_CLR ; Clear the interrupt bit. A 1192 00FF084B A 1193 PrimeEP2Fifo: 00FF084B A5A937F5 07 A 1194 jnb TXFIF1 , ?FifoAvailable ; Make sure a fifo is available 00FF0850 A5A936F5 02 A 1195 jnb TXFIF0 , ?FifoAvailable ; Make sure a fifo is available A 1196 00FF0855 80 7F A 1197 jmp ?Return A 1198 00FF0857 A 1199 ?FifoAvailable: 00FF0857 A57E37 E804 A 1200 mov WR6, _EP2DataCount ; Get data count in WR6 00FF085C A5BE34 0000 A 1201 cmp WR6, #00h ; is data count == 0? 00FF0861 A578 02 A 1202 jne ?Continue A 1203 00FF0864 80 70 A 1204 jmp ?Return A 1205 00FF0866 A 1206 ?Continue: 00FF0866 A5BE34 0008 A 1207 cmp WR6, #EP2MAXPACKET ; cmp with MPS 00FF086B 40 05 A 1208 jl ?LessThanMPS A 1209 00FF086D A 1210 ?MoreThanMPS: 00FF086D A57E34 0008 A 1211 mov WR6, #EP2MAXPACKET ; Set NoOfBytes to transfer to MPS A 1212 00FF0872 A 1213 ?LessThanMPS: 00FF0872 A57E57 E802 A 1214 mov WR10, _EP2TxPtr ; Get offset of first full location A 1215 ; in the endpoint buffer 00FF0877 A57EF4 E000 A 1216 mov WR30, #EP_2_Buffer ; set WR30 back to buffer start 00FF087C A52DF5 A 1217 add WR30, WR10 ; get to first full location A 1218 00FF087F A52D53 A 1219 add WR10, WR6 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 35 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0882 A55E54 07FF A 1220 anl WR10, #RINGWORDMASK ; do modulo 800h rollover 00FF0887 A57A57 E802 A 1221 mov _EP2TxPtr, WR10 A 1222 00FF088C A57E57 E804 A 1223 mov WR10, _EP2DataCount 00FF0891 A59D53 A 1224 sub WR10, WR6 00FF0894 A57A57 E804 A 1225 mov _EP2DataCount, WR10 A 1226 00FF0899 A5CA78 A 1227 push R7 00FF089C A 1228 ?ArmTXFifo: 00FF089C A57EF9C0 A 1229 mov R12, @WR30 ; Read data from buffer 00FF08A0 A57AC1F3 A 1230 mov TXDAT2, R12 ; store in Tx FIFO 00FF08A4 A50BF4 A 1231 inc WR30, #01h ; inc. the pointer 00FF08A7 A55EF4 F7FF A 1232 anl WR30, #RINGBUFFMASK ; do modulo 800h rollover 00FF08AC DF EE A 1233 djnz R7, ?ArmTXFifo 00FF08AE A5DA78 A 1234 pop R7 A 1235 00FF08B1 8FF6 A 1236 mov TXCNT2, R7 ; Write the transmit count A 1237 00FF08B3 A 1238 ?ReadyForRX: 00FF08B3 A5A923E1 11 A 1239 jb RXIE, ?Return_3 A 1240 00FF08B8 A 1241 ?RXWasDisabled: 00FF08B8 A52E54 0008 A 1242 add WR10, #EP2MAXPACKET ; The next packet can be a max of MPS 00FF08BD A5BE54 07FF A 1243 cmp WR10, #RINGBUFFSIZE ; If this is > than the total buffer sapce 00FF08C2 A538 04 A 1244 jg ?Return_3 ; return A 1245 00FF08C5 A5A9D3E1 A 1246 setb RXIE ; Set ready to RX as enuf buffer sp A 1247 ; now available. 00FF08C9 A 1248 ?Return_3: 00FF08C9 A57EB1F5 A 1249 mov R11, TXFLG 00FF08CD A55EB0C0 A 1250 anl R11, #0C0h 00FF08D1 60 03 A 1251 jZ ?Return 00FF08D3 02 0848 A 1252 jmp ServiceEP2TX 00FF08D6 A 1253 ?Return: 00FF08D6 22 A 1254 Ret A 1255 A 1256 COMMENT *------------------------------------------------------------ A 1257 Function name : ServiceEP3RX A 1258 Brief Description : Copies data recd. on EP 3 and stores the same in A 1259 : a buffer. A 1260 Regs preserved : No reg. is saved A 1261 --------------------------------------------------------------------* A 1262 SCOPE 00FF08D7 A 1263 ServiceEP3RX: 00FF08D7 53C07F A 1264 anl FIFLG, #EP3_RX_CLR ; Clear the interrupt bit 00FF08DA A5A920E2 02 A 1265 jb RXACK, ?GoodReceive ; If R_ACK set then a good reception A 1266 00FF08DF 80 58 A 1267 jmp ?Return ; else leave A 1268 00FF08E1 A 1269 ?GoodReceive: 00FF08E1 7E00 A 1270 mov R6, #00h 00FF08E3 AFE6 A 1271 mov R7, RXCNT3 ; Get the no. of bytes recd. PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 36 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF08E5 A5BE7000 A 1272 cmp R7, #00h ; Check whether a null data packet was recd. 00FF08E9 A568 49 A 1273 je ?NullPacketRecd ; 00FF08EC A57E57 F800 A 1274 mov WR10, _EP3RxPtr ; Get offset of next free location in the buffer 00FF08F1 A57EF4 F000 A 1275 mov WR30, #EP_3_Buffer ; get address of start of buffer. 00FF08F6 A52DF5 A 1276 add WR30, WR10 ; get to next free locaion. A 1277 00FF08F9 A52D53 A 1278 add WR10, WR6 00FF08FC A55E54 F7FF A 1279 anl WR10, #RINGBUFFMASK ; do modulo 800h rollover 00FF0901 A57A57 F800 A 1280 mov _EP3RxPtr, WR10 ; update the RXPtr offset in buffer. A 1281 00FF0906 A57E57 F804 A 1282 mov WR10, _EP3DataCount ; get current data count 00FF090B A52D53 A 1283 add WR10, WR6 ; add no. of bytes recd. 00FF090E A57A57 F804 A 1284 mov _EP3DataCount, WR10 ; update the data count A 1285 00FF0913 A 1286 ?CopyDataToBuffer: 00FF0913 A57EC1E3 A 1287 mov R12, RXDAT3 ; Read data from FIFO 00FF0917 A57AF9C0 A 1288 mov @WR30, R12 ; store in data buffer 00FF091B A50BF4 A 1289 inc WR30, #01h ; incr. ptr into buffer 00FF091E A55EF4 F7FF A 1290 anl WR30, #RINGBUFFMASK ; do modulo 800h rollover 00FF0923 DF EE A 1291 djnz R7, ?CopyDataToBuffer A 1292 00FF0925 A 1293 ?ReadyForAnotherRX: 00FF0925 A52E54 0008 A 1294 add WR10, #EP3MAXPACKET ; The next packet can ba a max of MPS 00FF092A A5BE54 07FF A 1295 cmp WR10, #RINGBUFFSIZE ; If this is < than the total buffer sapce, return 00FF092F 40 04 A 1296 jl ?NullPacketRecd A 1297 00FF0931 A5A9C3E1 A 1298 clr RXIE ; Set not ready to RX till a enuf space is availab A 1299 00FF0935 A 1300 ?NullPacketRecd: 00FF0935 A5A9D4E4 A 1301 setb RXFFRC ; signal FIFO read complete to trigger ARM A 1302 ; logic for FIFO management 00FF0939 A 1303 ?Return: 00FF0939 22 A 1304 Ret A 1305 A 1306 COMMENT *------------------------------------------------------------ A 1307 Function name : ServiceEP3TX A 1308 Brief Description : Deals with a transmit event on endpoint 1 It A 1309 : checks to be sure a FIFO is available. It then A 1310 : checks for data availability. If the no. of bytes A 1311 : of data is greater than the MaxPacket size, then A 1312 : MaxPacket bytes are sent. Otherwise all the A 1313 : available data is sent. In either case the data A 1314 : count and TxPtr are adjusted after the move. A 1315 : It can be called as the result of a Tx or an Rx A 1316 : interrupt. If its a Tx interrupt it enters at A 1317 : ServiceEP3TX. If its from an Rx interrupt it A 1318 : enters at PrimeEP3Fifo. A 1319 Regs preserved : No reg. is saved A 1320 --------------------------------------------------------------------* A 1321 SCOPE 00FF093A A 1322 ServiceEP3TX: 00FF093A 53C0BF A 1323 anl FIFLG, #EP3_TX_CLR ; Clear the interrupt bit. PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 37 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 1324 00FF093D A 1325 PrimeEP3Fifo: 00FF093D A5A937F5 07 A 1326 jnb TXFIF1, ?FifoAvailable ; Make sure a fifo is available 00FF0942 A5A936F5 02 A 1327 jnb TXFIF0, ?FifoAvailable ; Make sure a fifo is available A 1328 00FF0947 80 72 A 1329 jmp ?Return A 1330 00FF0949 A 1331 ?FifoAvailable: 00FF0949 A57E37 F804 A 1332 mov WR6, _EP3DataCount ; Get data count in WR6 00FF094E A5BE34 0000 A 1333 cmp WR6, #00h ; is data count == 0? 00FF0953 A578 02 A 1334 jne ?Continue A 1335 00FF0956 80 63 A 1336 jmp ?Return A 1337 00FF0958 A 1338 ?Continue: 00FF0958 A5BE34 0008 A 1339 cmp WR6, #EP3MAXPACKET ; cmp with MPS 00FF095D 40 05 A 1340 jl ?LessThanMPS A 1341 00FF095F A 1342 ?MoreThanMPS: 00FF095F A57E34 0008 A 1343 mov WR6, #EP3MAXPACKET ; Set NoOfBytes to transfer to MPS A 1344 00FF0964 A 1345 ?LessThanMPS: 00FF0964 A57E57 F802 A 1346 mov WR10, _EP3TxPtr ; Get offset of first full location A 1347 ; in the endpoint buffer 00FF0969 A57EF4 F000 A 1348 mov WR30, #EP_3_Buffer ; set WR30 back to buffer start 00FF096E A52DF5 A 1349 add WR30, WR10 ; get to first full location A 1350 00FF0971 A52D53 A 1351 add WR10, WR6 00FF0974 A55E54 07FF A 1352 anl WR10, #RINGWORDMASK ; do modulo 800h rollover 00FF0979 A57A57 F802 A 1353 mov _EP3TxPtr, WR10 A 1354 00FF097E A57E57 F804 A 1355 mov WR10, _EP3DataCount 00FF0983 A59D53 A 1356 sub WR10, WR6 00FF0986 A57A57 F804 A 1357 mov _EP3DataCount, WR10 A 1358 00FF098B A5CA78 A 1359 push R7 00FF098E A 1360 ?ArmTXFifo: 00FF098E A57EF9C0 A 1361 mov R12, @WR30 ; Read data from buffer 00FF0992 A57AC1F3 A 1362 mov TXDAT3, R12 ; store in Tx FIFO 00FF0996 A50BF4 A 1363 inc WR30, #01h ; inc. the pointer 00FF0999 A55EF4 F7FF A 1364 anl WR30, #RINGBUFFMASK ; do modulo 800h rollover 00FF099E DF EE A 1365 djnz R7, ?ArmTXFifo 00FF09A0 A5DA78 A 1366 pop R7 A 1367 00FF09A3 8FF6 A 1368 mov TXCNT3, R7 ; Write the transmit count A 1369 00FF09A5 A 1370 ?ReadyForRX: 00FF09A5 A5A923E1 11 A 1371 jb RXIE , ?Return A 1372 00FF09AA A 1373 ?RXWasDisabled: 00FF09AA A52E54 0008 A 1374 add WR10, #EP3MAXPACKET ; The next packet can be a max of MPS 00FF09AF A5BE54 07FF A 1375 cmp WR10, #RINGBUFFSIZE ; If this is > than the total buffer sapce PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 38 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF09B4 A538 04 A 1376 jg ?Return ; return A 1377 00FF09B7 A5A9D3E1 A 1378 setb RXIE ; Set ready to RX as enuf buffer space is A 1379 ; now available. 00FF09BB A 1380 ?Return: 00FF09BB 22 A 1381 Ret A 1382 A 1383 SCOPE A 1384 ;################################################################### A 1385 ;################### BufferControlData ############################ A 1386 ;## Transfers the data pointed to by DR28 into the IN Buffer ####### A 1387 ;## Also assumes that the first byte pointed to by DR28 is the ##### A 1388 ;## number of bytes to be moved, immediately followed by the data ## A 1389 ;################################################################### A 1390 A 1391 SCOPE 00FF09BC A 1392 BufferControlData: A 1393 ;DR28 has address of data 00FF09BC 7E00 A 1394 mov R6, #00h 00FF09BE A57E7B70 A 1395 mov R7, @DR28 ; Move Count 00FF09C2 A52EF4 0001 A 1396 add WR30, #01h ; increment pointer to first byte of data 00FF09C7 A57E9000 A 1397 mov R9, #00h A 1398 00FF09CB A57A93 A004 A 1399 mov in_rd_pntr, R9 ;Set buffer pointer to zero A 1400 ;for new transfer A 1401 00FF09D0 A57E57 9107 A 1402 mov WR10, wLength ; cmp no of bytes asked for with the A 1403 SWAP_BYTES R10,R11,R12 ; no. of bytes that the descriptor 00FF09D5 A57CCA A+ 1403 mov R12, R10 00FF09D8 A57CAB A+ 1403 mov R10, R11 00FF09DB A57CBC A+ 1403 mov R11, R12 A+ 1403 ENDMAC SWAP_BYTES 00FF09DE A5BD35 A 1404 cmp WR6, WR10 ; contains. 00FF09E1 A528 03 A 1405 jle ?Continue A 1406 00FF09E4 A57D35 A 1407 mov WR6, WR10 ; If the no. of bytes in the descriptor A 1408 ; is greater than the no. of bytes asked for A 1409 ; send back only the no. of bytes as per A 1410 ; the Setup packet. A 1411 00FF09E7 A 1412 ?Continue: 00FF09E7 A57A73 A005 A 1413 mov in_bytes_left, R7 ;Store Count A 1414 00FF09EC A57ED4 B000 A 1415 mov WR26, #LOW16(IN_BUFFERS) A 1416 00FF09F1 A 1417 ?MoveMemory: 00FF09F1 A57E7B90 A 1418 mov R9, @DR28 ; Get data 00FF09F5 A57AD990 A 1419 mov @WR26, R9 ; Store data 00FF09F9 A52ED4 0001 A 1420 add WR26, #01h 00FF09FE A52EF4 0001 A 1421 add WR30, #01h 00FF0A03 DF EC A 1422 djnz R7, ?MoveMemory A 1423 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 39 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0A05 22 A 1424 Ret A 1425 A 1426 ; --------------------------------------------------------- A 1427 ; A 1428 ; A 1429 ; --------------------------------------------------------- 00FF0A06 A 1430 SetStatusData: 00FF0A06 7A00 A 1431 mov R2, #00h 00FF0A08 A57A23 A004 A 1432 mov in_rd_pntr, R2 ;Set buffer pointer to zero A 1433 00FF0A0D 7A02 A 1434 mov R2, #02h 00FF0A0F A57A23 A005 A 1435 mov in_bytes_left, R2 ;point to count variable A 1436 00FF0A14 A57ED4 B000 A 1437 mov WR26, #LOW16(IN_BUFFERS) 00FF0A19 A51BD800 A 1438 mov @WR26, WR0 A 1439 00FF0A1D 22 A 1440 Ret A 1441 A 1442 ;################################################################### A 1443 ;################# DoControlOutput ################################## A 1444 ;################################################################### A 1445 A 1446 SCOPE 00FF0A1E A 1447 DoControlOutput: 00FF0A1E A5A9C1E1 A 1448 clr EPCON0.1 ; Set it up so that data is not Xmitted A 1449 ; while were are filling up the fifo. 00FF0A22 A57EA3 A005 A 1450 mov R10, in_bytes_left 00FF0A27 A5BEA000 A 1451 cmp R10, #00h ;check for none 00FF0A2B A578 07 A 1452 jne CntlDataAvail ;if ther is data do normal flow 00FF0A2E A57E8000 A 1453 mov R8, #00h ;if none, do null packet 00FF0A32 02 0A84 A 1454 ljmp ControlArmTx A 1455 00FF0A35 A 1456 CntlDataAvail: 00FF0A35 A57ED4 B000 A 1457 mov WR26, #LOW16(IN_BUFFERS) ;Get the address of the first char 00FF0A3A A57EC000 A 1458 mov R12, #00h ;set up a word value for add since 00FF0A3E A57ED3 A004 A 1459 mov R13, in_rd_pntr ;this is just a byte value. A 1460 00FF0A43 A52DD6 A 1461 add WR26, WR12 ;Add the read_pointer to the buffer location 00FF0A46 A57E8000 A 1462 mov R8, #00h ;initialize FIFO full counter 00FF0A4A A5CAA8 A 1463 push R10 ;save starting bytes avail count A 1464 00FF0A4D A 1465 ?WriteToFifo: 00FF0A4D A57ED9B0 A 1466 mov R11, @WR26 ;Get the data 00FF0A51 A57AB1F3 A 1467 mov TXDAT0, R11 ;write it into the FIFO 00FF0A55 A52ED4 0001 A 1468 add WR26, #01h ;Increment buffer pointer 00FF0A5A A52E8001 A 1469 add R8,#01h ;Increment FIFO count 00FF0A5E A59EA001 A 1470 sub R10, #01h ;Are we done with the buffer 00FF0A62 A568 07 A 1471 je ControlTxUpd A 1472 00FF0A65 A5BE8008 A 1473 cmp R8, #FIFO_SIZE ;FIFO FULL? 00FF0A69 A578 E1 A 1474 jne ?WriteToFifo A 1475 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 40 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0A6C A 1476 ControlTxUpd: 00FF0A6C A5DAA8 A 1477 pop R10 ;restore starting count 00FF0A6F A57EC3 A004 A 1478 mov R12, in_rd_pntr ;Get the offset into IN_BUFFER 00FF0A74 A52CC8 A 1479 add R12, R8 ;add amount we consumed 00FF0A77 A57AC3 A004 A 1480 mov in_rd_pntr, R12 ;store the new offset 00FF0A7C A59CA8 A 1481 sub R10, R8 ;subtract amount we just consumed 00FF0A7F A57AA3 A005 A 1482 mov in_bytes_left, R10 ;store new count A 1483 00FF0A84 A 1484 ControlArmTx: 00FF0A84 A57A81F6 A 1485 mov TXCNT0, R8 ;Write count into TXCNT register 00FF0A88 A5A9D1E1 A 1486 setb EPCON0.1 ;Enable data transmit A 1487 00FF0A8C A 1488 ?Return: 00FF0A8C 22 A 1489 Ret A 1490 A 1491 SCOPE A 1492 ;***************************************************** A 1493 ;***************** INIT_USB ************************* A 1494 ;***************************************************** A 1495 00FF0A8D A 1496 INIT_USB: A 1497 ;(KLS) 00FF0A8D 75F100 A 1498 mov EPINDEX, #00h 00FF0A90 75F484 A 1499 mov TXCON0,#84h ;/* Flush FIFO, sets Empty bit in TXFLG0, enable ATM. */ 00FF0A93 75E484 A 1500 mov RXCON0,#84h ;/* Flush FIFO, sets Empty bit in RXFLG0, enable ARM. */ A 1501 ; Enable endpoint 0 as a control endpoint. We need to set the A 1502 ; Transmit Endpoint enable, Receive Endpoint enable, and the A 1503 ; Receive Input enable. We do not set the Transmit Output enable A 1504 ; until we have determined what type of response we need to send A 1505 ; back, i.e., NULL packet for status phase or data for a "GET" A 1506 ; command. 00FF0A96 75E12D A 1507 mov EPCON0,#2Dh; A 1508 A 1509 ; The non-zero endpoints are being enabled here just so they will A 1510 ; NAK any tokens sent to them. This is really not correct, since A 1511 ; by the spec they should not respond at all until the host has A 1512 ; set a configuration for this endpoint. We will set the Receive A 1513 ; Endpoint enable and Transmit Endpoint enable bits for these guys A 1514 ; but not the input and output enables. A 1515 00FF0A99 75F101 A 1516 mov EPINDEX, #01h 00FF0A9C 75F484 A 1517 mov TXCON,#84h ;/* Flush FIFO, sets Empty bit in TXFLG1, enable ATM. */ 00FF0A9F 75E484 A 1518 mov RXCON,#84h ;/* Flush FIFO, sets Empty bit in RXFLG1, enable ARM. */ 00FF0AA2 A5A9D3E4 A 1519 setb RXISO ; Make it an ISO endpoint 00FF0AA6 75E10C A 1520 mov EPCON,#0Ch; ;/* Receive only */ A 1521 00FF0AA9 75F102 A 1522 mov EPINDEX, #02h 00FF0AAC 75F484 A 1523 mov TXCON,#84h ;/* Flush FIFO, sets Empty bit in TXFLG2, enable ATM. */ 00FF0AAF 75E484 A 1524 mov RXCON,#84h ;/* Flush FIFO, sets Empty bit in RXFLG2, enable ARM. */ 00FF0AB2 A5A9D3E4 A 1525 setb RXISO ; Make it an ISO endpoint 00FF0AB6 75E10C A 1526 mov EPCON,#0Ch; ;/* Receive only */ A 1527 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 41 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0AB9 75F103 A 1528 mov EPINDEX, #03h 00FF0ABC 75F484 A 1529 mov TXCON,#84h ;/* Flush FIFO, sets Empty bit in TXFLG3, enable ATM. */ 00FF0ABF 75E484 A 1530 mov RXCON,#84h ;/* Flush FIFO, sets Empty bit in RXFLG3, enable ARM. */ 00FF0AC2 A5A9D3E4 A 1531 setb RXISO ; Make it an ISO endpoint 00FF0AC6 75E10F A 1532 mov EPCON,#0Fh; ;/* Both endpoints enables */ 00FF0AC9 22 A 1533 RET A 1534 A 1535 SCOPE A 1536 ;***************************************************** A 1537 ;***************** INIT_UART ************************* A 1538 ;***************************************************** A 1539 00FF0ACA A 1540 INIT_UART: 00FF0ACA 759850 A 1541 mov SCON, #050h A 1542 ;Timer 2 is being used to generate baud rates. 00FF0ACD 75CAD9 A 1543 mov RCAP2L, #0D9h ; USB EVAL 9600 ?==? 9600/19200 16-bit reload value for baud 00FF0AD0 75CBFF A 1544 mov RCAP2H, #0FFh ; 00FF0AD3 75C834 A 1545 mov T2CON, #034h ; Set TIMER 2 into baud rate generator WORKS(A) 00FF0AD6 C299 A 1546 clr TI ; Clear Transmit interrupt A 1547 ;; mov IEN0, #0 ; KILL ALL INTERUPTS 00FF0AD8 12 0C0C A 1548 LCALL Lng_Delay 00FF0ADB 759900 A 1549 mov SBUF, #00 00FF0ADE 12 0C0C A 1550 LCALL Lng_Delay 00FF0AE1 22 A 1551 ret A 1552 A 1553 A 1554 A 1555 ;************************************************************************ A 1556 ;************* DEVICE DESCRIPTOR **************************************** A 1557 ;************************************************************************ A 1558 A 1559 ; A 1560 ; NOTE!!!!! '251 is a Big Endian machine. Words and DWords are stored with the A 1561 ; LSB in the numerically higher address. A 1562 ; A 1563 00FF0AE2 A 1564 DEVICE_DESCRIPTOR: 00FF0AE2 12 A 1565 gDLength: db 012h ;Used by packet transfer routines. 00FF0AE3 12 A 1566 gDevice_bLength: db 012h 00FF0AE4 01 A 1567 gDevice_bDescriptorType: db DEVICE_DESCR 00FF0AE5 0001 A 1568 gDevice_bcdUSB: dw 0001h ; Version 1.00 compliant 00FF0AE7 DC A 1569 gDevice_bDeviceClass: db 0DCh 00FF0AE8 00 A 1570 gDevice_bDeviceSubClass: db 00h 00FF0AE9 00 A 1571 gDevice_bDeviceProtocol: db 00h 00FF0AEA 08 A 1572 gDevice_wMaxPacketSize0: db 08h ;8 byte max for EP0 00FF0AEB 8680 A 1573 gDevice_widVendor: dw 8680h ;Intel Vendor ID (8086) 00FF0AED 9298 A 1574 gDevice_widProduct: dw 9298h ; 00FF0AEF 5001 A 1575 gDevice_bcdDevice: dw 5001h ;device version 1.50 00FF0AF1 00 A 1576 gDevice_iManufacturer: db 0h ;These three fields are supposed 00FF0AF2 00 A 1577 gDevice_iProduct: db 0h ;to contain the index of strings 00FF0AF3 00 A 1578 gDevice_iSerialNumber: db 0h ;describing device. 00FF0AF4 01 A 1579 gDevice_bNumConfigurations: db 01h PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 42 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 1580 A 1581 A 1582 ;/*--------------- Initialize global Config descriptor ----------------*/ 00FF0AF5 A 1583 CONFIGURATION_DESCRIPTOR: 00FF0AF5 2E A 1584 gCLength: db gEndDescriptorLabel-gConfig_bLength A 1585 ; ^^^^ Used by packet transfer routines. A 1586 00FF0AF6 09 A 1587 gConfig_bLength: db 09h 00FF0AF7 02 A 1588 gConfig_bDescriptorType: db CONFIG_DESCR 00FF0AF8 2E A 1589 gConfig_bTotalLength: db gEndDescriptorLabel-gConfig_bLength ; 00FF0AF9 00 A 1590 gConfig_bCorrection: db 0 00FF0AFA 01 A 1591 gConfig_bNumInterfaces: db 1 ; NUM_OF_INTERFACES; 00FF0AFB 01 A 1592 gConfig_bConfigurationValue: db 1 00FF0AFC 00 A 1593 gConfig_iConfiguration: db 0 00FF0AFD 40 A 1594 gConfig_bmAttributes: db 040h 00FF0AFE 25 A 1595 gConfig_MaxPower: db 025h ;50ma A 1596 A 1597 ; /*------------- Initialize global Interface descriptor ---------------*/ 00FF0AFF A 1598 gInterfaceDescriptor: 00FF0AFF 09 A 1599 gInterface_bLength: db 09h 00FF0B00 04 A 1600 gInterface_bDescriptorType: db INTERFACE_DESCR 00FF0B01 00 A 1601 gInterface_bInterfaceNumber: db 00h 00FF0B02 00 A 1602 gInterface_bAlternateSetting: db 00h 00FF0B03 04 A 1603 gInterface_bNumEndpoints: db 04h 00FF0B04 DC A 1604 gInterface_bInterfaceClass: db 0DCh 00FF0B05 50 A 1605 gInterface_bInterfaceSubClass: db 50h 00FF0B06 80 A 1606 gInterface_bInterfaceProtocol: db 80h 00FF0B07 00 A 1607 gInterface_iInterface: db 0 A 1608 A 1609 ; /*------------- Initialize Endpoint 1 descriptor ---------------*/ 00FF0B08 A 1610 gEndPoint1: 00FF0B08 07 A 1611 gEP_bLength: db 07h 00FF0B09 05 A 1612 gEP_bDescriptorType: db ENDPOINT_DESCR 00FF0B0A 01 A 1613 gEP_bEndpointAddress: db 01h ;EP address 1, out 00FF0B0B 01 A 1614 gEP_bmAtrributes: db 01h ;ISOC 00FF0B0C 0800 A 1615 gEP_wMaxPacketSize: dw 0800h ;Max Packet 8 bytes 00FF0B0E 00 A 1616 gEP_bInterval: db 0h A 1617 A 1618 ; /*------------- Initialize Endpoint 1B descriptor ---------------*/ 00FF0B0F A 1619 gEndPoint2: 00FF0B0F 07 A 1620 gEPB_bLength: db 07h 00FF0B10 05 A 1621 gEPB_bDescriptorType: db ENDPOINT_DESCR 00FF0B11 02 A 1622 gEPB_bEndPointAddress: db 02h ;EP address 2, out 00FF0B12 01 A 1623 gEPB_bmAtrributes: db 01h ;ISOC 00FF0B13 0800 A 1624 gEPB_wMaxPacketSize: dw 0800h ;Max Packet 8 bytes 00FF0B15 00 A 1625 gEPB_bInterval: db 0h A 1626 A 1627 ; /*------------- Initialize Endpoint 1B descriptor ---------------*/ 00FF0B16 A 1628 gEndPoint3: 00FF0B16 07 A 1629 gEP3_bLength: db 07h 00FF0B17 05 A 1630 gEP3_bDescriptorType: db ENDPOINT_DESCR 00FF0B18 03 A 1631 gEP3_bEndPointAddress: db 03h ;EP address 2, out PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 43 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0B19 01 A 1632 gEP3_bmAtrributes: db 01h ;ISOC 00FF0B1A 0800 A 1633 gEP3_wMaxPacketSize: dw 0800h ;Max Packet 8 bytes 00FF0B1C 00 A 1634 gEP3_bInterval: db 0h A 1635 A 1636 ; /*------------- Initialize Endpoint 1B descriptor ---------------*/ 00FF0B1D A 1637 gEndPoint4: 00FF0B1D 07 A 1638 gEP4_bLength: db 07h 00FF0B1E 05 A 1639 gEP4_bDescriptorType: db ENDPOINT_DESCR 00FF0B1F 83 A 1640 gEP4_bEndPointAddress: db 83h ;EP address 3, in 00FF0B20 03 A 1641 gEP4_bmAtrributes: db 03h ;interrupt 00FF0B21 0800 A 1642 gEP4_wMaxPacketSize: dw 0800h ;Max Packet 8 bytes 00FF0B23 10 A 1643 gEP4_bInterval: db 10h A 1644 00FF0B24 A 1645 gEndDescriptorLabel: A 1646 A 1647 SCOPE 00FF0B24 A 1648 INIT_VARIABLES: A 1649 ;Init SETUP VARIABLES A 1650 00FF0B24 A57EB000 A 1651 mov R11,#0 ; Zero out R11 to represent initial state 00FF0B28 A57EE4 0000 A 1652 mov WR28,#0 ; Access in page 00h 00FF0B2D A57EF4 9000 A 1653 mov WR30,#LOW16(SetupSeq) ; Offset of SetupSeq var 00FF0B32 A57A7BB0 A 1654 mov @DR28,R11 ; Initial state is wait for SETUP A 1655 00FF0B36 A57E54 0000 A 1656 mov WR10, #00h ; 00FF0B3B A57EF4 D800 A 1657 mov WR30, #LOW16(_EP1RxPtr); 00FF0B40 A51B7A50 A 1658 mov @DR28, WR10 ; 00FF0B44 A52EF4 0002 A 1659 add WR30, #02h ; 00FF0B49 A51B7A50 A 1660 mov @DR28, WR10 ; 00FF0B4D A52EF4 0002 A 1661 add WR30, #02h ; 00FF0B52 A51B7A50 A 1662 mov @DR28, WR10 ; A 1663 ;initialize the buffer variables for 00FF0B56 A57EF4 E800 A 1664 mov WR30, #LOW16(_EP2RxPtr);the three endpoints 00FF0B5B A51B7A50 A 1665 mov @DR28, WR10 ; 00FF0B5F A52EF4 0002 A 1666 add WR30, #02h ; 00FF0B64 A51B7A50 A 1667 mov @DR28, WR10 ; 00FF0B68 A52EF4 0002 A 1668 add WR30, #02h ; 00FF0B6D A51B7A50 A 1669 mov @DR28, WR10 ; A 1670 ; 00FF0B71 A57EF4 F800 A 1671 mov WR30, #LOW16(_EP3RxPtr); 00FF0B76 A51B7A50 A 1672 mov @DR28, WR10 ; 00FF0B7A A52EF4 0002 A 1673 add WR30, #02h ; 00FF0B7F A51B7A50 A 1674 mov @DR28, WR10 ; 00FF0B83 A52EF4 0002 A 1675 add WR30, #02h ; 00FF0B88 A51B7A50 A 1676 mov @DR28, WR10 ; A 1677 A 1678 ; Clear out the EPxrunning variables 00FF0B8C A57EF4 D809 A 1679 mov WR30, #LOW16(EP1running); 00FF0B91 A51B7A50 A 1680 mov @DR28, WR10 ; 00FF0B95 A52EF4 0001 A 1681 add WR30, #01h ;EP2 00FF0B9A A51B7A50 A 1682 mov @DR28, WR10 ; 00FF0B9E A52EF4 0001 A 1683 add WR30, #01h ;EP3 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 44 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0BA3 A51B7A50 A 1684 mov @DR28, WR10 ; 00FF0BA7 A52EF4 0001 A 1685 add WR30, #01h ;ISO_out_err 00FF0BAC A51B7A50 A 1686 mov @DR28, WR10 ; 00FF0BB0 A52EF4 0001 A 1687 add WR30, #01h ;TestVal 00FF0BB5 A51B7A50 A 1688 mov @DR28, WR10 ; A 1689 00FF0BB9 A57EA4 0000 A 1690 mov WR20,#0 00FF0BBE A57EB4 A000 A 1691 mov WR22, #low16(out_var_table) 00FF0BC3 A57E54 0000 A 1692 mov WR10, #0 00FF0BC8 A57E44 0000 A 1693 mov WR8,#0 00FF0BCD A57A5BB0 A 1694 ?l1: mov @DR20,R11 ;This loop zeroes out the 64 byte area 00FF0BD1 A52EB4 0001 A 1695 add WR22,#1 ;at out_var_table. I'm not sure why. 00FF0BD6 A52E8001 A 1696 add R8,#1 00FF0BDA A5BE8040 A 1697 cmp R8,#64 00FF0BDE A578 EC A 1698 jne ?l1 A 1699 A 1700 ;Zero out the output buffer area. A 1701 00FF0BE1 A57EA4 0000 A 1702 mov WR20, #0 00FF0BE6 A57EB4 C000 A 1703 mov WR22, #low16(OUT_BUFFERS) 00FF0BEB A57E54 0000 A 1704 mov WR10, #0 00FF0BF0 A57E44 0000 A 1705 mov WR8,#0 00FF0BF5 A57A5BB0 A 1706 ?l2: mov @DR20,R11 00FF0BF9 A52EB4 0001 A 1707 add WR22,#1 00FF0BFE A52E44 0001 A 1708 add WR8,#1 A 1709 ; cmp WR8,#1000 00FF0C03 A5BE44 0010 A 1710 cmp WR8,#10h 00FF0C08 A578 EA A 1711 jne ?l2 A 1712 00FF0C0B 22 A 1713 RET A 1714 SCOPE A 1715 A 1716 00FF0C0C A 1717 Lng_Delay: 00FF0C0C A5CAC9 A 1718 push WR24 00FF0C0F A5CAD9 A 1719 push WR26 00FF0C12 A57EC4 0082 A 1720 MOV WR24, #082H 00FF0C17 80 10 A 1721 JMP DE2 A 1722 A 1723 00FF0C19 A 1724 Delay_X: ;MOV P1,DPXL 00FF0C19 A5CAC9 A 1725 push WR24 ;5 states 00FF0C1C A5CAD9 A 1726 push WR26 ;5 states 00FF0C1F A57EC4 0001 A 1727 MOV WR24, #001H ;3 states 00FF0C24 A 1728 DE1: 00FF0C24 A57ED4 04FF A 1729 MOV WR26, #004FFH ;3 states cfffh original ;0fff works 00FF0C29 A 1730 DE2: 00FF0C29 A51BD4 A 1731 DEC WR26, #1 ;2 states 00FF0C2C A5BED4 0000 A 1732 CMP WR26, #00H ;4 states 00FF0C31 A578 F5 A 1733 JNE DE2 ;5 states T ; 2 states NT 00FF0C34 A51BC4 A 1734 DEC WR24, #1 ;2 states 00FF0C37 A5BEC4 0000 A 1735 CMP WR24, #00H ;4 states PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 45 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 00FF0C3C A578 E5 A 1736 JNE DE1 ;5 states T ; 2 states NT 00FF0C3F A5DAD9 A 1737 POP WR26 ;5 states 00FF0C42 A5DAC9 A 1738 POP WR24 ;5 states 00FF0C45 22 A 1739 QUICK1: RET ; A 1740 A 1741 A 1742 A 1743 A 1744 ;############################################################# A 1745 ;####### RAM MEMORY MAP ###################################### A 1746 ;############################################################# A 1747 A 1748 ; org 00:0000h ;0-4ff Reserved A 1749 A 1750 ; org 00:0500h ; Variables A 1751 A 1752 ; org 00:0600h ; Variables for the IN token buffers A 1753 A 1754 ;; A 1755 ;; Data block for EP1. Contains buffer space and some management variables. A 1756 ;; A 1757 A 1758 define OUR_DATA_SEG, SPACE=pdata A 1759 segment OUR_DATA_SEG A 1760 0000D000 A 1761 org 00:D000h 0000D000 A 1762 EP_1_Buffer: ds 10h A 1763 0000D800 A 1764 org 00:D800h 0000D800 A 1765 _EP1RxPtr: ds 2 0000D802 A 1766 _EP1TxPtr: ds 2 0000D804 A 1767 _EP1DataCount: ds 2 0000D806 A 1768 _gbMPSEndPoint1: ds 1 0000D807 A 1769 _gbMPSEndPoint2: ds 1 0000D808 A 1770 Critical: ds 1 0000D809 A 1771 EP1running: ds 1 0000D80A A 1772 EP2running: ds 1 0000D80B A 1773 EP3running: ds 1 0000D80C A 1774 ISO_out_err: ds 1 0000D80D A 1775 TestVal: ds 1 A 1776 ;; A 1777 ;; Data block for EP2. Contains buffer space and some management variables. A 1778 ;; A 1779 0000E000 A 1780 org 00:E000h 0000E000 A 1781 EP_2_Buffer: ds 10h A 1782 0000E800 A 1783 org 00:E800h 0000E800 A 1784 _EP2RxPtr: ds 2 0000E802 A 1785 _EP2TxPtr: ds 2 0000E804 A 1786 _EP2DataCount: ds 2 A 1787 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 46 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm A 1788 ;; A 1789 ;; Data block for EP3. Contains buffer space and some management variables. A 1790 ;; A 1791 0000F000 A 1792 org 00:F000h 0000F000 A 1793 EP_3_Buffer: ds 10h A 1794 0000F800 A 1795 org 00:F800h 0000F800 A 1796 _EP3RxPtr: ds 2 0000F802 A 1797 _EP3TxPtr: ds 2 0000F804 A 1798 _EP3DataCount: ds 2 A 1799 A 1800 00009000 A 1801 org 00:9000h A 1802 00009000 A 1803 SETUP_VARS: 00009000 A 1804 SetupSeq: ds 1 00009001 A 1805 new_addr: ds 1 A 1806 00009100 A 1807 org 00:9100h A 1808 00009100 A 1809 COMMAND_BUFFER: 00009100 A 1810 ds 1 ; Byte Count 00009101 A 1811 StandardDeviceRequest: 00009101 A 1812 bmRequestType: ds 1 00009102 A 1813 bRequest: ds 1 00009103 A 1814 wValue: ds 2 00009105 A 1815 wIndex: ds 2 00009107 A 1816 wLength: ds 2 A 1817 A 1818 A 1819 ; define OUR_DATA_SEG, SPACE=data, ORG=00:A000h A 1820 ; segment OUR_DATA_SEG A 1821 0000A000 A 1822 org 00:A000h A 1823 A 1824 0000A000 A 1825 out_var_table: 0000A000 A 1826 out_cur_buf: ds 2 0000A002 A 1827 out_cnt: ds 2 A 1828 0000A004 A 1829 in_var_table: A 1830 0000A004 A 1831 in_rd_pntr: ds 1 0000A005 A 1832 in_bytes_left: ds 1 0000A006 A 1833 in_FIFO_size: ds 1 0000A007 A 1834 in_FIFO_empty: ds 1 A 1835 0000B000 A 1836 org 00:B000h ; A 1837 0000B000 A 1838 IN_BUFFERS: A 1839 PLC 80251 Macro Assembler, Version 2.10 17-Jan-97 15:50:24 page: 47 PC Machine Code I Line File: c:\usb\930code\iso_rec\isorec.asm 0000C000 A 1840 org 00:C000h ; A 1841 0000C000 A 1842 OUT_BUFFERS: A 1843 A 1844 A 1845 END Errors: 0 Warnings: 0 Lines Assembled: 2399