

        WIDGET.ASSEM            Page   1
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T      1 
0000            T      2                 .LSTOFF
0000            T     33                 .LSTON
0000            T     34                 .FIN
0000            T     35 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T     36 ;>
0000            T     37 ;>     This file describes all the definitions ( Constants, Vars, I/O,
0000            T     38 ;>  etc. ) that is used in the Widget Firmware.
0000            T     39 ;>
0000            T     40 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T     41 
















































        WIDGET.ASSEM            Page   2
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T     42                 .Page
0000            T     43                 
0000            T     44 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T     45 ;>
0000            T     46 ;>      Z8 Working Register/Internal Ram Conventions
0000            T     47 ;>
0000            T     48 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T     49 
0000            T     50 
0000            T     51 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T     52 ;>
0000            T     53 ;>      Working Register Set $0: Registers 0:3 are used as I/O ports
0000            T     54 ;>
0000            T     55 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T     56 ;>
0000            T     57 ;>              Register         Use
0000            T     58 ;>              -------          ---
0000            T     59 ;>                 0             I/O: Port 0 { Output }
0000            T     60 ;>                                 Bit 0: Adr8
0000            T     61 ;>                                 Bit 1: Adr9
0000            T     62 ;>                                 Bit 2: Adr10/RWI-
0000            T     63 ;>                                         RWI: Reduced Write Cuurent
0000            T     64 ;>                                 Bit 3: Adr11/PC-
0000            T     65 ;>                                         PC: Pre-Compensation
0000            T     66 ;>                                 Bit 4: Servo_Reset-
0000            T     67 ;>                                 Bit 5: Format_Enable-
0000            T     68 ;>                                 Bit 6: Z8_Test-
0000            T     69 ;>                                 Bit 7: Read_Header
0000            T     70 ;>
0000            T     71 ;>                 1             I/O: Port 1 { Input/Output }
0000            T     72 ;>                                 Bit 0: Adr0/Apple_Bus0
0000            T     73 ;>                                 Bit 1: Adr1/Apple_Bus1
0000            T     74 ;>                                 Bit 2: Adr2/Apple_Bus2
0000            T     75 ;>                                 Bit 3: Adr3/Apple_Bus3
0000            T     76 ;>                                 Bit 4: Adr4/Apple_Bus4
0000            T     77 ;>                                 Bit 5: Adr5/Apple_Bus5
0000            T     78 ;>                                 Bit 6: Adr6/Apple_Bus6
0000            T     79 ;>                                 Bit 7: Adr7/Apple_Bus7
0000            T     80 ;>
0000            T     81 ;>                 2             I/O: Port 2 { Input/Output }
0000            T     82 ;>                                 Bit 0: Start-
0000            T     83 ;>                                 Bit 1: EccError-
0000            T     84 ;>                                 Bit 2: Command { Input }
0000            T     85 ;>                                 Bit 3: Busy
0000            T     86 ;>                                 Bit 4: Msel0
0000            T     87 ;>                                 Bit 5: Msel1
0000            T     88 ;>                                 Bit 6: SioRdy { Input }
0000            T     89 ;>                                 Bit 7: Disk_RW-
0000            T     90 ;>
0000            T     91 ;>                 3             I/O: Port 3 { Input/Output }
0000            T     92 ;>                                 Bit 0: SioDataIn { Input }
0000            T     93 ;>                                 Bit 1: Sector { Input }
0000            T     94 ;>                                 Bit 2: Index { Input }
0000            T     95 ;>                                 Bit 3: Sector_Done





        WIDGET.ASSEM            Page   3
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T     96 ;>                                 Bit 4: Data_Memory_Select
0000            T     97 ;>                                 Bit 5: Head_Select
0000            T     98 ;>                                 Bit 6: Z8_RW_Clock
0000            T     99 ;>                                 Bit 7: SioDataOut
0000            T    100 ;>
0000            T    101 ;>>>>>>>>>>>>>>>>>>>>>>>>





















































        WIDGET.ASSEM            Page   4
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    102                 .Page
0000            T    103 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    104 ;>
0000            T    105 ;>      Misc. Conventions
0000            T    106 ;>
0000            T    107 ;>              1. Each major routine is preceded by a psuedo-english
0000            T    108 ;>                 "Pascal" like explanation of the inputs, outputs,
0000            T    109 ;>                 and algorithm, as well as register assignments.
0000            T    110 ;>
0000            T    111 ;>              2. KeyWords:
0000            T    112 ;>                  BOOLEAN : True/False values: $01 if true, $00 if false
0000            T    113 ;>                  BIT     : Single bit values: 1 if true, 0 if false
0000            T    114 ;>                  BYTE    : 8 bit values
0000            T    115 ;>                  WORD    : 16 bit values
0000            T    116 ;>                  PTR     : 16 bit address
0000            T    117 ;>
0000            T    118 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    119                 .DO     ListDefs
0000            T    120                 .LSTON








































        WIDGET.ASSEM            Page   5
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    121                 .Page
0000            T    122                 .FIN
0000 10 00      T    123 RamOffset       .Equ    $1000
0000 10 00      T    124 EpromOffset     .Equ    $1000
0000            T    125                 
0000            T    126 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    127 ;>
0000            T    128 ;>      Constant Definitions: I/O Stuff
0000            T    129 ;>
0000            T    130 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    131 
0000 00 00      T    132 Port0           .Equ    0               ;I/O Port definitions
0000 00 01      T    133 Port1           .Equ    1               ;       |
0000 00 02      T    134 Port2           .Equ    2               ;       |
0000 00 03      T    135 Port3           .Equ    3               ;      \|/
0000            T    136 
0000            T    137 ;> Port 0 Defs:
0000            T    138 
0000 00 01      T    139 TimeOut         .Equ    $01             ;hardware timeout flag
0000 00 02      T    140 EccTest         .Equ    $02             ;Active Low to Ecc gate array chip
0000 00 04      T    141 RWI             .Equ    $04             ;Reduced Write Current { active low }
0000 00 08      T    142 PC              .Equ    $08             ;Write Pre-compensation { active low }
0000 00 00      T    143 ServoRst        .Equ    $00             ;Servo Reset { active low }
0000 00 10      T    144 Not_ServoRst    .Equ    $10
0000 00 20      T    145 Not_FmenL       .Equ    $20             ;Format Enable { active low }
0000 00 00      T    146 FmenL           .Equ    $00
0000 00 20      T    147 AcEraseL        .Equ    $20
0000 00 00      T    148 Not_AcEraseL    .Equ    $00
0000 00 00      T    149 ZTestL          .Equ    $00             ;Z8 Test switch { 1=normal, 0=test }
0000 00 40      T    150 Not_ZTestL      .Equ    $40
0000 00 80      T    151 RdHdrH          .Equ    $80             ;State Machine: Ignore Header
0000 00 00      T    152 Not_RdHdrH      .Equ    $00             ;               { active hi }
0000            T    153 
0000            T    154 ;> Port 1 Defs:
0000            T    155 ;> { none }
0000            T    156 
0000            T    157 ;> Port 2 Defs:
0000            T    158 
0000 00 00      T    159 StartL          .Equ    $00             ;State Machine: Start Execution
0000 00 01      T    160 Not_StartL      .Equ    $01             ;               { active low }
0000 00 00      T    161 EccError        .Equ    $00             ;Flags Ecc circuitry { active low }
0000 00 02      T    162 Not_EccError    .Equ    $02
0000 00 04      T    163 Cmd             .Equ    $04             ;Apple i/o signal: CMD { active hi }
0000 00 08      T    164 Bsy             .Equ    $08             ;Apple i/o signal: BSY { active hi }
0000 00 00      T    165 Not_Bsy         .Equ    $00
0000 00 10      T    166 Msel0           .Equ    $10             ;Memory Select bit 0
0000 00 20      T    167 Msel1           .Equ    $20             ;Memory Select bit 1
0000            T    168  
0000 00 00      T    169  Apple_Mem      .Equ    $00             ;Mem <--> Apple
0000 00 10      T    170  Z8_Mem         .Equ    $10             ;Mem <--> Z8
0000 00 20      T    171  Disk_Mem       .Equ    $20             ;Mem <--> State Machine ( Disk )
0000 00 30      T    172  Z8_Apple       .Equ    $30             ;Z8 <--> Apple
0000            T    173 
0000 00 40      T    174 SioRdy          .Equ    $40             ;Servo's Sio is ready { active hi }





        WIDGET.ASSEM            Page   6
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 80      T    175 DrwL_Read       .Equ    $80             ;State Machine: Disk Read/Write
0000 00 00      T    176 DrwL_Write      .Equ    $00             ;               { Write active lo }
0000            T    177 
0000 00 02      T    178 P21_In          .Equ    $02             ;Port 2 Bit 1 is an input
0000 00 04      T    179 P22_In          .Equ    $04             ;Port 2 Bit 2 is an input
0000 00 40      T    180 P26_In          .Equ    $40             ;Port 2 Bit 6 is an input
0000            T    181 
0000            T    182 ;> Port 3 Defs:
0000            T    183 
0000 00 02      T    184 SectorMark      .Equ    $02             ;Sector Mark from drive { active hi }
0000 00 04      T    185 IndexMark       .Equ    $04             ;Index Mark from drive { active hi }
0000 00 08      T    186 SectDnL         .Equ    $08             ;Sector Done { active low }
0000 00 10      T    187 Dm              .Equ    $10             ;Data Memory selected { active low }
0000 00 20      T    188 Hs0             .Equ    $20             ;Head select { 0=head_0, 1=head_1 }
0000 00 40      T    189 Zrwck           .Equ    $40             ;Z8 test clock for state machine
0000            T    190 











































        WIDGET.ASSEM            Page   7
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    191                 .Page
0000            T    192                 
0000            T    193 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    194 ;>
0000            T    195 ;>      Constant Definitions: Registers
0000            T    196 ;>
0000            T    197 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    198 
0000 00 00      T    199 Wrk_Io          .Equ    $00             ;Working regs set 0 = I/O and scratch
0000 00 10      T    200 Wrk_Sys         .Equ    $10             ;Working regs set 1 = System
0000 00 20      T    201 Wrk_Except      .Equ    $20             ;Working regs set 2 = Exception set
0000 00 30      T    202 Wrk_Sys2        .Equ    $30             ;Working regs set 3 = System2
0000 00 40      T    203 Wrk_Scr         .Equ    $40             ;Working regs set 4 = Scratch set
0000 00 F0      T    204 Wrk_Cntrl       .Equ    $F0             ;Working regs set F = control set
0000            T    205 
0000 00 00      T    206 r0              .Equ    0               ;working register 0
0000 00 01      T    207 r1              .Equ    1               ;working register 1
0000 00 02      T    208 r2              .Equ    2               ;working register 2
0000 00 03      T    209 r3              .Equ    3               ;working register 3
0000 00 04      T    210 r4              .Equ    4               ;working register 4
0000 00 05      T    211 r5              .Equ    5               ;working register 5
0000 00 06      T    212 r6              .Equ    6               ;working register 6
0000 00 07      T    213 r7              .Equ    7               ;working register 7
0000 00 08      T    214 r8              .Equ    8               ;working register 8
0000 00 09      T    215 r9              .Equ    9               ;working register 9
0000 00 0A      T    216 rA              .Equ    $A              ;working register A
0000 00 0B      T    217 rB              .Equ    $B              ;working register B
0000 00 0C      T    218 rC              .Equ    $C              ;working register C
0000 00 0D      T    219 rD              .Equ    $D              ;working register D
0000 00 0E      T    220 rE              .Equ    $E              ;working register E
0000 00 0F      T    221 rF              .Equ    $F              ;working register F
0000            T    222 
0000 00 20      T    223 Hi_Rwi_Reg      .Equ    $20     ;holds cylinder value for RWI and PC
0000 00 21      T    224 Lo_Rwi_Reg      .Equ    $21
0000            T    225 
0000 00 22      T    226 PSector         .Equ    $22             ;last phsyical sector
0000 00 23      T    227 Free_SlfTst     .Equ    $23             ;pointer to self test routine
0000            T    228 
0000 00 24      T    229 Excpt_Status    .Equ    $24             ;exception status register
0000 00 80      T    230  Recovery        .Equ    $80            ;global recovery bit { active hi }
0000 00 40      T    231  SprTbl_Warn     .Equ    $40            ;spare table has is almost full
0000 00 20      T    232  Buf_Damage      .Equ    $20            ;StMach entry buffer is not zero
0000 00 10      T    233  PwrRst          .Equ    $10            ;Widget was power reset
0000 00 08      T    234  NZero_Stat      .Equ    $08            ;last system status was non-zero
0000 00 01      T    235  Led_Stat        .Equ    $01            ;state of LED on controller
0000            T    236 
0000 00 25      T    237 SlfTst_Result   .Equ    $25             ;results of self test
0000 00 80      T    238  Ram_Fail        .Equ    $80            ;writeable memory failure
0000 00 40      T    239  Eprom_Fail      .Equ    $40            ;Eprom checkbyte mismatch
0000 00 20      T    240  Disk_Speed      .Equ    $20            ;Disk not up to speed
0000 00 10      T    241  Servo_Fail      .Equ    $10            ;Servo is not healthy
0000 00 08      T    242  Sector_Cnt      .Equ    $08            ;Not enough sectors!
0000 00 04      T    243  State_Fail      .Equ    $04            ;State machine not healthy
0000 00 02      T    244  Rw_Fail         .Equ    $02            ;can't read/write!





        WIDGET.ASSEM            Page   8
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 01      T    245  No_SprTbl       .Equ    $01            ;No Spare Table found!
0000            T    246  
0000 00 26      T    247 RdStat          .Equ    $26             ;status of last read operation
0000 00 27      T    248 RdErrCnt        .Equ    $27             ;number of retries of last read
0000 00 28      T    249 WrStat          .Equ    $28             ;status of last write operation
0000 00 29      T    250 WrErrCnt        .Equ    $29             ;number of retries of last write
0000 00 2A      T    251 SeekCount       .Equ    $2A             ;number of seeks since last arm swing
0000            T    252 
0000 00 2C      T    253 PwrFlg0         .Equ    $2C             ;power on flag
0000 00 2D      T    254 PwrFlg1         .Equ    $2D
0000 00 2E      T    255 PwrFlg2         .Equ    $2E
0000 00 2F      T    256 PwrFlg3         .Equ    $2F
0000            T    257 
0000 00 36      T    258 Dmt_Counter     .Equ    $36      ;double register counter
0000 00 38      T    259 Scr_Cntr        .Equ    $38      ;double register counter
0000            T    260 
0000 00 50      T    261 Cur_Cyl         .Equ    $50
0000            T    262 
0000 00 52      T    263 Cylinder        .Equ    $52
0000 00 54      T    264 Head            .Equ    $54
0000 00 55      T    265 Sector          .Equ    $55
0000            T    266 
0000 00 56      T    267 DiskStatus      .Equ    $56             ;current state of some disk params
0000 00 80      T    268  On_Track        .Equ    $80     ;software 'on-track' flag
0000 00 40      T    269  RdHdrRecal      .Equ    $40     ;read the header after a recal operation
0000 00 20      T    270  Wr_Op           .Equ    $20     ;current access is for a write
0000 00 10      T    271  Parked          .Equ    $10     ;heads are currenly parked
0000 00 08      T    272  Seq_CachSrch    .Equ    $08     ;search the cache sequentially
0000 00 04      T    273  MultiBlk        .Equ    $04     ;MultiBlock semaphore
0000 00 02      T    274  SeekComplete    .Equ    $02     ;head/arm is not in motion
0000 00 01      T    275  Offset_On       .Equ    $01     ;Auto_Offset is currently on
0000            T    276 
0000 00 57      T    277 Seek_Type       .Equ    $57             ;Seek w/wo Auto-Offset
0000 00 58      T    278 Data_Type       .Equ    $58             ;Spare Table or User Block
0000 00 59      T    279 Unused_Reg      .Equ    $59             ;reflection of bank register
0000            T    280 
0000 00 5A      T    281 BlkStat         .Equ    $5A             ;current state of cache logical block
0000 00 80      T    282  CachSeek        .Equ    $80       ;a seek is needed for this block
0000 00 40      T    283  CachHdChg       .Equ    $40       ;a head change is needed for this block
0000 00 01      T    284  S_Block         .Equ    $01       ;this block is a spare block
0000 00 02      T    285  B_Block         .Equ    $02       ;this block is a bad block
0000            T    286  
0000 00 5B      T    287 Cache_Index     .Equ    $5B     ;Index into cache assuming sequential search
0000            T    288 
0000 00 5C      T    289 Lst_HiCyl       .Equ    $5C     ;previous seek address
0000 00 5D      T    290 Lst_LoCyl       .Equ    $5D     ; "
0000 00 5E      T    291 Lst_Head        .Equ    $5E     ; "
0000 00 5F      T    292 Lst_Sector      .Equ    $5F     ; "
0000            T    293 
0000 00 04      T    294 P01m_Image      .Equ    $04
0000 00 05      T    295 P3m_Image       .Equ    $05
0000 00 06      T    296 P01m_StMach     .Equ    $06
0000 00 07      T    297 P3m_StMach      .Equ    $07
0000 00 08      T    298 Dm_Mask         .Equ    $08





        WIDGET.ASSEM            Page   9
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 09      T    299 Start_Mask      .Equ    $09
0000            T    300 
0000 00 40      T    301 ScrReg0         .Equ    $40             ;Scratch register 0
0000 00 41      T    302 ScrReg1         .Equ    $41             ;Scratch register 1
0000 00 42      T    303 ScrReg2         .Equ    $42             ;Scratch register 2
0000 00 43      T    304 ScrReg3         .Equ    $43             ;Scratch register 3
0000 00 44      T    305 ScrReg4         .Equ    $44             ;Scratch register 4
0000 00 45      T    306 ScrReg5         .Equ    $45             ;Scratch register 5
0000 00 46      T    307 ScrReg6         .Equ    $46             ;Scratch register 6
0000 00 47      T    308 ScrReg7         .Equ    $47             ;Scratch register 7
0000 00 48      T    309 ScrReg8         .Equ    $48             ;Scratch register 8
0000 00 49      T    310 ScrReg9         .Equ    $49             ;Scratch register 9
0000 00 4A      T    311 ScrRegA         .Equ    $4A             ;Scratch register A
0000 00 4B      T    312 ScrRegB         .Equ    $4B             ;Scratch register B
0000 00 4C      T    313 ScrRegC         .Equ    $4C             ;Scratch register C
0000 00 4D      T    314 ScrRegD         .Equ    $4D             ;Scratch register D
0000 00 4E      T    315 ScrRegE         .Equ    $4E             ;Scratch register E
0000 00 4F      T    316 ScrRegF         .Equ    $4F             ;Scratch register F
0000            T    317 
0000 00 F0      T    318 R240            .Equ     240            ;Sio Register
0000 00 F1      T    319 R241            .Equ     241            ;Timer Mode Register
0000 00 F2      T    320 R242            .Equ     242            ;Counter/Timer Register 1
0000 00 F3      T    321 R243            .Equ     243            ;T1 Prescaler Load Register
0000 00 F4      T    322 R244            .Equ     244            ;Counter/Timer Register 0
0000 00 F5      T    323 R245            .Equ     245            ;T0 Prescaler Load Register
0000 00 F6      T    324 R246            .Equ     246            ;Port 2 Mode Register
0000 00 F7      T    325 R247            .Equ     247            ;Port 3 Mode Register
0000 00 F8      T    326 R248            .Equ     248            ;Port 0 and 1 mode Register
0000 00 F9      T    327 R249            .Equ     249            ;Interrupt Priority Register
0000 00 FA      T    328 R250            .Equ     250            ;Interrupt Request Register
0000 00 FB      T    329 R251            .Equ     251            ;Interrupt Mask Register
0000 00 FC      T    330 R252            .Equ     252            ;Cpu Flags Register
0000 00 FD      T    331 R253            .Equ     253            ;Working Register Set Pointer
0000 00 FE      T    332 R254            .Equ     254            ;Hi-Byte of Stack Pointer
0000 00 FF      T    333 R255            .Equ     255            ;Low-Byte of Stack Pointer
0000            T    334 























        WIDGET.ASSEM            Page  10
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    335                 .Page
0000            T    336 
0000            T    337 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    338 ;>
0000            T    339 ;>      These Symbols are Predefined inside the assembler
0000            T    340 ;>
0000            T    341 ;>
0000            T    342 ;> Sio             .Equ     240            ;Sio Register
0000            T    343 ;> Tmr             .Equ     241            ;Timer Mode Register
0000            T    344 ;> T1              .Equ     242            ;Counter/Timer Register 1
0000            T    345 ;> Pre1            .Equ     243            ;T1 Prescaler Load Register
0000            T    346 ;> T0              .Equ     244            ;Counter/Timer Register 0
0000            T    347 ;> Pre0            .Equ     245            ;T0 Prescaler Load Register
0000            T    348 ;> P2m             .Equ     246            ;Port 2 Mode Register
0000            T    349 ;> P3m             .Equ     247            ;Port 3 Mode Register
0000            T    350 ;> P01m            .Equ     248            ;Port 0 and 1 mode Register
0000            T    351 ;> Ipr             .Equ     249            ;Interrupt Priority Register
0000            T    352 ;> Irq             .Equ     250            ;Interrupt Request Register
0000            T    353 ;> Imr             .Equ     251            ;Interrupt Mask Register
0000            T    354 ;> Flags           .Equ     252            ;Cpu Flags Register
0000            T    355 ;> Rp              .Equ     253            ;Working Register Set Pointer
0000            T    356 ;> Sph             .Equ     254            ;Hi-Byte of Stack Pointer
0000            T    357 ;> Spl             .Equ     255            ;Low-Byte of Stack Pointer
0000            T    358 ;>
0000            T    359 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    360 

































        WIDGET.ASSEM            Page  11
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    361                 .Page
0000            T    362                 
0000            T    363 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    364 ;>
0000            T    365 ;>      Constant Definitions: Control Register Stuff
0000            T    366 ;>
0000            T    367 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    368 
0000            T    369 ;> Control Register 240 ( $F0 ): Serial I/O register
0000            T    370 ;>              { Read: Receive Data }
0000            T    371 ;>              { Write: Transmit Data }
0000            T    372 
0000            T    373 ;> Control Register 241 ( $F1 ): Timer Mode Register
0000            T    374 
0000            T    375 ;> Tout Modes: Bits 7 and 6
0000 00 40      T    376   T0_Out        .Equ    $40             ;Port 3, bit 6 gets timer 0 out
0000 00 80      T    377   T1_Out        .Equ    $80             ;Port 3, bit 6 gets timer 1 out
0000 00 C0      T    378   Int_Out       .Equ    $C0             ;Port 3, bit 6 gets system clock
0000            T    379   
0000            T    380 ;> Tin Mode: Bits 5 and 4
0000 00 00      T    381   Ext_Clk       .Equ    $00             ;use external clock on timer
0000 00 10      T    382   Gate_Clk      .Equ    $10             ;use internal clock on timer
0000 00 20      T    383   Non_Retrig    .Equ    $20             ;load T1 after a high-low trans
0000 00 30      T    384   Retrig        .Equ    $30             ;like Non-Retrig, but load on all trans.
0000            T    385   
0000 00 08      T    386   T1_CntEn      .Equ    $08             ;enable T1 counting operations
0000 00 00      T    387   T1_CntDis     .Equ    $00
0000            T    388   
0000 00 04      T    389   T1_Load       .Equ    $04             ;Load T1
0000            T    390   
0000 00 02      T    391   T0_CntEn      .Equ    $02             ;enable T0 counting operations
0000 00 00      T    392   T0_CntDis     .Equ    $00
0000            T    393   
0000 00 01      T    394   T0_Load       .Equ    $01             ;Load T0
0000            T    395   
0000            T    396 ;> Control Register 242 ( $F2 ): Counter/Timer Register T1
0000            T    397 ;>              { Write: Initial Value }
0000            T    398 ;>              { Read: Current Count Value }
0000            T    399 
0000            T    400 ;> Control Register 243 ( $F3 ): T1 Prescaler Load Register ( Pre 1 )
0000 00 00      T    401   Single_Pass   .Equ    $00
0000 00 01      T    402   Mod_n         .Equ    $01
0000 00 02      T    403   T1_Int_Clk    .Equ    $02
0000 00 00      T    404   T1_Ext_Clk    .Equ    $00
0000            T    405 ;> Bits 7:2 are used to provide a 6-bit binary Prescale Value
0000            T    406 
0000            T    407 ;> Control Register 244 ( $F4 ): Counter/Timer Register T0
0000            T    408 ;>              { Write: Initial Value }
0000            T    409 ;>              { Read: Current Count Value }
0000            T    410 
0000            T    411 ;> Control Register 245 ( $F5 ): T0 Prescaler Load Register ( Pre 0 )
0000            T    412 ;>      { Same as Pre 1, but no external clock }
0000            T    413 
0000            T    414 ;> Control Register 246 ( $F6 ): Port 2 Mode ( P2m)





        WIDGET.ASSEM            Page  12
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    415 ;>  When a bit of P2m is set, the corresponding bit in Port 2 is defined
0000            T    416 ;>  as an input, if reset then the corresponding bit for Port 2 is
0000            T    417 ;>  defined as an output.
0000            T    418 
0000            T    419 ;> Control Register 247 ( $F7 ): Port 3 Mode ( P3m )
0000 00 00      T    420   Open_Drain    .Equ    $00
0000 00 01      T    421   Totem_Pol     .Equ    $01
0000 00 00      T    422   B2_5_Io       .Equ    $00             ;Bit 2=input, Bit 5=output
0000 00 04      T    423   B2_5_Hs       .Equ    $04             ;Bit 2=DAV0-, Bit 5=RDY0-
0000 00 00      T    424   B3_4_Io       .Equ    $00             ;Bit 3=input, Bit 4=output
0000 00 10      T    425   B3_4_Idm      .Equ    $10             ;Bit 3=input, Bit 4=DM-
0000 00 18      T    426   B3_4_Hs       .Equ    $18             ;Bit 3=DAV1-, Bit 4=RDY1-
0000 00 00      T    427   B1_6_Io       .Equ    $00             ;Bit 1=Tin  , Bit 6=Tout
0000 00 20      T    428   B1_6_Hs       .Equ    $20             ;Bit 1=DAV2-, Bit 6=RDY2-
0000 00 00      T    429   B0_7_Io       .Equ    $00             ;Bit 0=input, Bit 7=output
0000 00 40      T    430   B0_7_Ser      .Equ    $40             ;Bit 0=Sio in, Bit 7=Sio out
0000 00 80      T    431   Par_On        .Equ    $80             ;Parity On
0000 00 00      T    432   Par_Off       .Equ    $00             ;Parity Off
0000            T    433   
0000            T    434 ;> Control Register 248 ( $F8 ): Port 0 and 1 Mode ( P01m )
0000 00 00      T    435   P0_03_Out     .Equ    $00             ;select Port 0, bits 0:3 as outputs
0000 00 01      T    436   P0_03_In      .Equ    $01             ;select Port 1, bits 0:3 as inputs
0000 00 02      T    437   P0_03_Adr     .Equ    $02             ;select P0, bits 0:3 as adr bits 8:11
0000 00 00      T    438   Stack_Ext     .Equ    $00             ;select external stack
0000 00 04      T    439   Stack_In      .Equ    $04             ;select internal stack
0000 00 00      T    440   P1_Out        .Equ    $00             ;select Port 1 as outputs
0000 00 08      T    441   P1_In         .Equ    $08             ;select Port 1 as inputs
0000 00 10      T    442   P1_Adr        .Equ    $10             ;select Port 1 as adr/data bits 0:7
0000 00 18      T    443   P1_Tri        .Equ    $18             ;put port 1 into Tri-State
0000 00 20      T    444   Mem_Ext       .Equ    $20             ;extended memory timing
0000 00 00      T    445   Mem_Norm      .Equ    $00             ;normal memory timing
0000 00 00      T    446   P0_47_Out     .Equ    $00             ;select Port 0, bits 4:7 as outputs
0000 00 40      T    447   P0_47_In      .Equ    $40             ;select Port 0, bits 4:7 as inputs
0000 00 80      T    448   P0_47_Adr     .Equ    $80             ;select P0, bits 4:7 as adr bits 12:15
0000            T    449   
0000            T    450 ;> Control Register 249 ( $F9 ): Interrupt Priority Register ( Ipr )
0000            T    451 ;>              { To Be Established }
0000            T    452 
0000            T    453 ;> Control Register 250 ( $FA ): Interrupt Request Register ( Irq )
0000            T    454 ;>              { To Be Established }
0000            T    455 
0000            T    456 ;> Control Register 251 ( $FB ): Interrupt Mask Register ( Imr )
0000            T    457 ;>              { To Be Established }
0000            T    458 
0000            T    459 ;> Control Register 252 ( $FC ): Flag Register ( Flags )
0000            T    460 ;>              { To Be Established }
0000            T    461                 .LSTOFF
0000            T    466                 .LSTON











        WIDGET.ASSEM            Page  13
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    467                 .Page
0000            T    468                 .FIN
0000            T    469 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    470 ;>
0000            T    471 ;>      Controller Status Port
0000            T    472 ;>
0000            T    473 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    474 
0000 1F 00      T    475 Status_Port     .Equ    $1F00
0000            T    476 
0000 00 80      T    477 CrcErrL         .Equ    $80     ;status bit 7: Crc Error { active lo }
0000 00 40      T    478 WrtNvldL        .Equ    $40     ;status bit 6: Write Not Valid { active lo }
0000 00 20      T    479 ServoRdy        .Equ    $20     ;status bit 5: Servo Ready { active hi }
0000 00 10      T    480 ServoErr        .Equ    $10     ;status bit 4: Servo Error { active hi }
0000 00 0F      T    481 Ymask           .Equ    $0F     ;mask for status bits 0:3: state
0000 00 02      T    482  Norm_State      .Equ    $02     ;normal end state for Read,Write,ReadHdr
0000 00 0A      T    483  NormFmt_State   .Equ    $0A     ;normal end state for Format
0000 00 00      T    484  NoHdr_State     .Equ    $00     ;last state if no matching header found
0000 00 00      T    485  Start_State     .Equ    $00     ;beginning state machine state
0000            T    486                 







































        WIDGET.ASSEM            Page  14
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000            T    487                 .Page
0000            T    488 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    489 ;>
0000            T    490 ;>      Constant Definitions: Miscellaneous
0000            T    491 ;>
0000            T    492 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000            T    493 
0000 00 80      T    494 Stack_Top       .Equ    $80             ;Register $7F + 1
0000 00 0C      T    495 Init_Pc         .Equ    $0c             ;Initial Pc setting after RESET
0000            T    496 
0000 00 02      T    497 IntL_Dflt       .Equ    #02             ;assume drive interleaved 1:1
0000 00 0C      T    498 Map_Dflt        .Equ    #$0C            ;Map 5:1 onto 2:1 as default
0000            T    499 
0000 00 02      T    500 RegLpTimes      .Equ    2               ;Loop twice ( 0's and 1's )
0000 00 80      T    501 RegCount        .Equ    128             ;Total number of regs z8
0000 00 05      T    502 RegUsed         .Equ    5               ;this test uses r4,r5,r6,r7,r8
0000 00 04      T    503 I_OregUsed      .Equ    4               ;Ports 0,1,2,3 can't be tested here
0000 00 7F      T    504 HiRegAdr        .Equ    RegCount-1
0000            T    505         
0000 08 00      T    506 RamSize         .Equ    2048            ;Physical length of 6116 ( 2kx8 )
0000 07 FF      T    507 HiRamAdr        .Equ    RamSize-1
0000 00 02      T    508 RamLpTimes      .Equ    2               ;loop twice ( 0's and 1's )
0000            T    509 
0000 10 00      T    510 EpromSize       .Equ    4096
0000 0F FF      T    511 MaxEpromAddress .Equ    EpromSize - 1
0000 00 01      T    512 EpromStartAdr   .Equ    $0001
0000            T    513 
0000 00 02      T    514 Max_Cmnd_Types  .Equ    $02             ;currently only three types of cmnds
0000 00 F0      T    515 CmndType        .Equ    $F0             ;mask for TYPE of command
0000 00 07      T    516 Cmnd_Len        .Equ    $07
0000 00 05      T    517 Servo_Len       .Equ    $05
0000            T    518 
0000            T    519                 .DO     W_10MB
0000 00 00      T    520 HiMaxLogical    .Equ    $00     ;highest user block = $04BFF
0000 00 4B      T    521 MidMaxLogical   .Equ    $4B
0000 00 FF      T    522 LoMaxLogical    .Equ    $FF
0000 00 02      T    523 HiMaxCyl        .Equ    $02     ;highest cylinder = $220 ( 544 )
0000 00 20      T    524 LoMaxCyl        .Equ    $20
0000 00 01      T    525 Init_HiCyl      .Equ    $01     ;initial setting for data cylinder
0000 00 F9      T    526 Init_LoCyl      .Equ    $F9
0000 00 02      T    527 Tst_HiCyl       .Equ    $02     ;Cyl, Head, and sector of R/W test area
0000 00 05      T    528 Tst_LoCyl       .Equ    $05
0000 00 00      T    529 Tst_Head        .Equ    $00
0000 00 00      T    530 Tst_Sctr        .Equ    $00
0000 00 13      T    531 NbrSctrs        .Equ    19      ;number of sectors = 19
0000 00 02      T    532 NbrHds          .Equ    2       ;number of heads = 2
0000 02 02      T    533 NbrTracks       .Equ    514     ;number of tracks = 514
0000 00 00      T    534 HiSpr0          .Equ    $00     ;logical block of Spr( 0 )
0000 00 19      T    535 MidSpr0         .Equ    $19
0000 00 55      T    536 LoSpr0          .Equ    $55
0000 00 00      T    537 HiSpr1          .Equ    $00     ;logical block of Spr( 1 )
0000 00 32      T    538 MidSpr1         .Equ    $32
0000 00 AA      T    539 LoSpr1          .Equ    $AA
0000 00 02      T    540 HiParkCyl       .Equ    $02     ;cylinder to park heads at





        WIDGET.ASSEM            Page  15
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 35      T    541 LowParkCyl      .Equ    $35
0000            T    542                 .FIN
0000   --SKIP--      543                 .DO     W_20MB
0000   --SKIP--      544 HiMaxLogical    .Equ    $00     ;highest user block = $0984B
0000   --SKIP--      545 MidMaxLogical   .Equ    $98
0000   --SKIP--      546 LoMaxLogical    .Equ    $4B
0000   --SKIP--      547 HiMaxCyl        .Equ    $02     ;highest cylinder = $220 ( 544 )
0000   --SKIP--      548 LoMaxCyl        .Equ    $20
0000   --SKIP--      549 Init_HiCyl      .Equ    $01     ;initial setting for data cylinder
0000   --SKIP--      550 Init_LoCyl      .Equ    $F9
0000   --SKIP--      551 Tst_HiCyl       .Equ    $02     ;Cyl, Head, and sector of R/W test area
0000   --SKIP--      552 Tst_LoCyl       .Equ    $05
0000   --SKIP--      553 Tst_Head        .Equ    $00
0000   --SKIP--      554 Tst_Sctr        .Equ    $00
0000   --SKIP--      555 NbrSctrs        .Equ    38      ;number of sectors = 38
0000   --SKIP--      556 NbrHds          .Equ    2       ;number of heads = 2
0000   --SKIP--      557 NbrTracks       .Equ    514     ;number of tracks = 514
0000   --SKIP--      558 HiSpr0          .Equ    $00     ;logical block of Spr( 0 )
0000   --SKIP--      559 MidSpr0         .Equ    $32
0000   --SKIP--      560 LoSpr0          .Equ    $AA
0000   --SKIP--      561 HiSpr1          .Equ    $00     ;logical block of Spr( 1 )
0000   --SKIP--      562 MidSpr1         .Equ    $65
0000   --SKIP--      563 LoSpr1          .Equ    $54
0000   --SKIP--      564 HiParkCyl       .Equ    $02     ;cylinder to park heads at
0000   --SKIP--      565 LowParkCyl      .Equ    $35
0000                 566                 .FIN
0000   --SKIP--      567                 .DO     W_40MB
0000   --SKIP--      568 HiMaxLogical    .Equ    $01     ;highest user block = $130E3
0000   --SKIP--      569 MidMaxLogical   .Equ    $30
0000   --SKIP--      570 LoMaxLogical    .Equ    $E3
0000   --SKIP--      571 HiMaxCyl        .Equ    $04     ;highest cylinder = $440 ( 1088 )
0000   --SKIP--      572 LoMaxCyl        .Equ    $40
0000   --SKIP--      573 Init_HiCyl      .Equ    $03     ;initial setting for data cylinder
0000   --SKIP--      574 Init_LoCyl      .Equ    $F9
0000   --SKIP--      575 Tst_HiCyl       .Equ    $04     ;Cyl, Head, and sector of R/W test area
0000   --SKIP--      576 Tst_LoCyl       .Equ    $0A
0000   --SKIP--      577 Tst_Head        .Equ    $00
0000   --SKIP--      578 Tst_Sctr        .Equ    $00
0000   --SKIP--      579 NbrSctrs        .Equ    38      ;number of sectors = 38
0000   --SKIP--      580 NbrHds          .Equ    2       ;number of heads = 2
0000   --SKIP--      581 NbrTracks       .Equ    1028    ;number of tracks = 1028
0000   --SKIP--      582 HiSpr0          .Equ    $00     ;logical block of Spr( 0 )
0000   --SKIP--      583 MidSpr0         .Equ    $65
0000   --SKIP--      584 LoSpr0          .Equ    $54
0000   --SKIP--      585 HiSpr1          .Equ    $00     ;logical block of Spr( 1 )
0000   --SKIP--      586 MidSpr1         .Equ    $CA
0000   --SKIP--      587 LoSpr1          .Equ    $A8
0000   --SKIP--      588 HiParkCyl       .Equ    $04     ;cylinder to park heads at
0000   --SKIP--      589 LowParkCyl      .Equ    $6A
0000                 590                 .FIN
0000                 591                 
0000 00 03           592 SprThresh       .Equ    3 ;this many CRC errors to be candidate for sparing
0000                 593 
0000 00 00           594 Write_Op        .Equ    $00     ;current operation is a write





        WIDGET.ASSEM            Page  16
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 80           595 Read_OP         .Equ    $80     ;current operation is a read
0000                 596                 
0000 00 40           597 Wait            .Equ    $40     ;wait for seek-end
0000                 598 
0000 00 80           599 Nil             .Equ    $80     ;Nil Ptr
0000 00 40           600 Used            .Equ    $40     ;Spare Block in table is used
0000 00 20           601 Useable         .Equ    $20     ;Spare Block in table is useable
0000 00 10           602 Spare           .Equ    $10     ;element is a true spare
0000 00 00           603 BadBlock        .Equ    $00     ;element is a bad block
0000                 604 
0000 00 08           605 SprTbl_Type     .Equ    $08     ;type of element is spare table
0000 00 04           606 ID_Type         .Equ    $04     ;type of element is ID block
0000 00 02           607 User_Type       .Equ    $02     ;type of element is User data block
0000                 608 
0000 00 01           609 Found           .Equ    $01     ;Block was found in spare table
0000                 610 
0000 00 80           611 Random          .Equ    $80     ;search cache by index
0000                 612 
0000 00 80           613 TestBitMap      .Equ    $80     ;check bit map location for 0 or 1
0000 00 40           614 SetBitMap       .Equ    $40     ;set a bit map location
0000 00 20           615 ClearBitMap     .Equ    $20     ;clear a bit map location
0000                 616 
0000 02 1D           617 BlockLength     .Equ    1 + 532 + 2 + 6 ; Length = Dummy + Data + CRC + ECC
0000                 618 
0000 00 80           619 RdError         .Equ    $80
0000 00 40           620 RdSrvoErr       .Equ    $40
0000 00 20           621 RdSuccess       .Equ    $20
0000 00 10           622 RdNoHdrFnd      .Equ    $10
0000 00 08           623 RdCrcErr        .Equ    $08
0000                 624 
0000 00 80           625 RdHError        .Equ    $80
0000 00 40           626 RdHSrvoErr      .Equ    $40
0000                 627 
0000 00 80           628 WrError         .Equ    $80
0000 00 40           629 WrSrvoErr       .Equ    $40
0000 00 20           630 WrSuccess       .Equ    $20
0000 00 10           631 WrNoHdrFnd      .Equ    $10
0000                 632 
0000 00 80           633 FmtError         .Equ    $80
0000 00 40           634 FmtSrvoErr       .Equ    $40
0000 00 20           635 FmtSuccess       .Equ    $20
0000 00 06           636 Max_InterLeave   .Equ    $06
0000                 637 
0000 00 80           638 Cmnd_Pending    .Equ    $80     ;Wait_Cmnd was called from a command
0000 00 40           639 IBsy            .Equ    $40     ;set BSY
0000 00 20           640 MultiWr         .Equ    $20     ;current operation is MultiBlockWrite
0000                 641 
0000 00 80           642 Frst_SprTbl     .Equ    $80     ;First spare table has been found
0000                 643 
0000                 644 ;> Data Exception Error Codes
0000 00 80           645 Error           .Equ    $80
0000 00 00           646 Ex_Undetermined .Equ    $00     ;Undetermined error ( recovery off? )
0000 00 02           647 Ex_SprBlock     .Equ    $02     ;Spare this block!
0000 00 04           648 Ex_BadBlock     .Equ    $04     ;make this block a bad block





        WIDGET.ASSEM            Page  17
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 06           649 Ex_ReadErr      .Equ    $06     ;non-catastophic error during read
0000 00 08           650 Ex_HdrBad       .Equ    $08     ;make this block bad because no header
0000 00 0A           651 Ex_HdrSpr       .Equ    $0A     ;spare this block because no header
0000                 652 
0000 00 0A           653 Ex_Case_Max     .Equ    $0A     ;maximum case values
0000                 654 
0000                 655 ;> Interface Responses
0000 00 02           656 Read_Response   .Equ    $02     ;Interface Response to a Read command
0000 00 03           657 Wr_Response     .Equ    $03     ;Interface Response to a Write command
0000 00 04           658 WrVer_Response  .Equ    $04     ;Interface Response to a Write Verify command
0000 00 06           659 End_Wr_Response .Equ    $06     ;Interface response after receiving wr data
0000 00 02           660 D_R_ID_Response .Equ    $02
0000 00 03           661 Rd_Stat_Resp    .Equ    $03
0000 00 04           662 Rd_SStat_Resp   .Equ    $04
0000 00 05           663 Sd_S_C_Respone  .Equ    $05
0000 00 06           664 S_Seek_Response .Equ    $06
0000 00 07           665 S_Rstr_Response .Equ    $07
0000 00 08           666 Set_Rcvr_Resp   .Equ    $08
0000 00 0A           667 S_Park_Respone  .Equ    $0A
0000 00 0B           668 D_Read_Response .Equ    $0B
0000 00 0C           669 D_RdHdr_Resp    .Equ    $0C
0000 00 0D           670 D_Write_Resp    .Equ    $0D
0000 00 0E           671 St_Map_Response .Equ    $0E
0000 00 0F           672 D_R_Spr_Resp    .Equ    $0F
0000 00 10           673 Wr_Spr_Resp     .Equ    $10
0000 00 11           674 Fmt_Response    .Equ    $11
0000 00 12           675 I_Spr_Response  .Equ    $12
0000 00 13           676 Rd_Abrt_Resp    .Equ    $13
0000 00 14           677 RstSrvo_Resp    .Equ    $14
0000 00 15           678 D_Scan_Response .Equ    $15
0000                 679 
0000 00 22           680 Sys_Rd_Resp     .Equ    $22
0000 00 23           681 Sys_Wr_Resp     .Equ    $23
0000 00 A3           682 Sys_WrEx_Resp   .Equ    $A3
0000 00 27           683 Sys_WrEnd_Resp  .Equ    $27
0000 00 24           684 Sys_WrVer_Resp  .Equ    $24
0000                 685 
0000 00 00           686 Profile         .Equ    $00     ;Device Interface Type is Profile
0000 00 01           687 Widget          .Equ    $01     ;Device Interface Type is Widget
0000                 688 
0000 00 01           689 Pro_Log_Offset  .Equ    $01     ;offset from start of command to blocknumber
0000 00 03           690 Sys_Log_Offset  .Equ    $03
0000                 691 
0000 00 00           692 Inc_SprCnt      .Equ    $00
0000 00 01           693 Inc_BadCnt      .Equ    $01
0000 00 02           694 Dec_BadCnt      .Equ    $02
0000                 695 
0000                 696 ;> System Status Definitions
0000                 697 
0000                 698 ;> Byte 0
0000 00 80           699 Bad_55          .Equ    $80     ;Status: Other than 55 response from host
0000 00 40           700 WrBuf_OR        .Equ    $40     ;Status: Write Buffer OverFlow
0000 00 08           701 Stat_Rd_Err     .Equ    $08     ;Status: Read Error
0000 00 04           702 Stat_No_Hdr     .Equ    $04     ;Status: No Header Found





        WIDGET.ASSEM            Page  18
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 02           703 Stat_Srvo       .Equ    $02     ;Status: Unrecoverable Servo Error
0000 00 01           704 Op_Failed       .Equ    $01     ;Status: Operation Failed
0000                 705 
0000                 706 ;> Byte 1
0000 00 40           707 SprBlk_Hard     .Equ    $40     ;Status: No room left in spare table
0000 00 20           708 SprBlk_Warn     .Equ    $20     ;Status: 5 or less spare blocks available
0000 00 08           709 Stat_SlfTst     .Equ    $08     ;Status: Abort caused by self test failure
0000 00 04           710 Stat_Spare      .Equ    $04     ;Status: Sparing has occured
0000 00 02           711 Stat_Seek       .Equ    $02     ;Status: Seek to wrong track
0000 00 01           712 Stat_Abort      .Equ    $01     ;Status: Controller aborted
0000                 713 
0000                 714 ;> Byte2
0000 00 80           715 Power_Reset     .Equ    $80     ;Widget was power reset
0000 00 40           716 Illegal_Block   .Equ    $40     ;Status: Block number out of bounds
0000                 717 
0000                 718 ;> Byte3
0000 00 80           719 EccStat         .Equ    $80     ;read error detected by ecc
0000 00 40           720 CrcStat         .Equ    $40     ;read error detected by crc
0000 00 20           721 Hdr_MisMatch    .Equ    $20     ;timeout waiting for header
0000                 722 
0000                 723 ;> Bank Switch Registers Defs
0000                 724 
0000 18 00           725 BankReg         .Equ    $1800 ;address of first bank bit
0000                 726 
0000 18 00           727 Led             .Equ    $1800 ;address of Led bit
0000 00 FE           728 Led_Mask        .Equ    $FE   ;mask for Led bit
0000                 729 
0000 19 00           730 RamBank0        .Equ    $1900 ;address of first Ram_Bank bit
0000 00 00           731 Ram0            .Equ    $0    ;offset of ram bank zero
0000 00 01           732 Ram1            .Equ    $1
0000 00 02           733 Ram2            .Equ    $2
0000 00 03           734 Ram3            .Equ    $3
0000                 735 
0000 1E 00           736 RomBank0        .Equ    $1E00
0000 1D 00           737 RomBank2        .Equ    $1D00
0000 00 00           738 Eprom0          .Equ    $0
0000 00 01           739 Eprom1          .Equ    $1
0000 00 02           740 Eprom2          .Equ    $2
0000 00 03           741 Eprom3          .Equ    $3
0000 00 04           742 Eprom4          .Equ    $4
0000                 743                 


















        WIDGET.ASSEM            Page  19
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000                 744                 .Page
0000                 745 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 746 ;>
0000                 747 ;>      Servo Definitions
0000                 748 ;>
0000                 749 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 750 
0000 00 00           751 S_Cmnd_Byte     .Equ    $00     ;Servo Command Byte
0000 00 01           752 S_Diff_Byte     .Equ    $01     ;Servo Lo Difference Byte
0000 00 02           753 S_Off_Byte      .Equ    $02     ;Servo Offset Byte
0000 00 03           754 S_Stat_Byte     .Equ    $03     ;Servo Status Byte
0000                 755 
0000                 756 ;> BYTE 0       .Equ    Command, Direction, and Hi Difference Byte
0000                 757 
0000 00 00           758 ReadStatus      .Equ    $00     ;Servo Command: Read Status
0000 00 10           759 Offset          .Equ    $10     ;Servo Command: Offset, Track Following
0000 00 20           760 Diagnostic      .Equ    $20     ;Servo Command: Diagnostic
0000 00 40           761 DataRecal       .Equ    $40     ;Servo Command: Recalibrate heads, Data
0000 00 70           762 FrmtRecal       .Equ    $70     ;Servo Command: Recalibrate hedas, Format
0000 00 80           763 Access          .Equ    $80     ;Servo Command: Access only
0000 00 90           764 Access_Offset   .Equ    $90     ;Servo Command: Seek with Offset
0000 00 C0           765 Home            .Equ    $C0     ;Servo Command: Home the heads
0000                 766 
0000 00 00           767 Hd_Dir_Rev      .Equ    $00     ;Direction: Reverse
0000 00 04           768 Hd_Dir_Frwd     .Equ    $04     ;Direction: Forward
0000                 769 
0000                 770 ;> Bits 0:1     .Equ    Magnitude: Hi Difference
0000                 771 
0000                 772 ;> BYTE 1       .Equ    Magnitude: Lo Difference
0000                 773 
0000                 774 ;> BYTE 2       .Equ    Offset Byte
0000                 775 
0000 00 00           776 Off_Dir_Rev     .Equ    $00     ;Offset Direction Reverse
0000 00 80           777 Off_Dir_Frwd    .Equ    $80     ;Offset Direction Forward
0000 00 40           778 Off_Auto        .Equ    $40     ;Auto-Offset On
0000 00 20           779 Ld_Off_Val      .Equ    $20     ;Load Offset Value from DAC on Servo
0000                 780 ;> Off_Val      .Equ    $1F     ;5-bit value Loaded/Stored into DAC
0000                 781 
0000                 782 ;> BYTE 3       .Equ    Status Byte
0000                 783 
0000 00 00           784 S_Rate_19_2     .Equ    $00     ;Servo/Controller baud rate = 19.2
0000 00 80           785 S_Rate_57_6     .Equ    $80     ;Servo/Controller baud rate = 57.6
0000 00 40           786 Pwr_On_Reset    .Equ    $40     ;Servo Power-On Reset
0000                 787 
0000 00 00           788 S_Stat_0        .Equ    $00     ;Servo Status 0
0000 00 01           789 S_Stat_1        .Equ    $01     ;Servo Status 1
0000 00 02           790 S_Stat_2        .Equ    $02     ;Servo Status 2
0000 00 03           791 S_Stat_3        .Equ    $03     ;Servo Status 3
0000 00 04           792 S_Stat_4        .Equ    $04     ;Servo Status 4
0000 00 05           793 S_Stat_5        .Equ    $05     ;Servo Status 5
0000 00 06           794 S_Stat_6        .Equ    $06     ;Servo Status 6
0000 00 07           795 S_Stat_7        .Equ    $07     ;Servo Status 7
0000 00 08           796 S_Stat_8        .Equ    $08     ;Servo Status 8
0000                 797 





        WIDGET.ASSEM            Page  20
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000 00 01           798 S_Norm_Status   .Equ    S_Stat_1        ;Normal Servo Status
0000                 799 
0000                 800 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 801 ;>
0000                 802 ;>      Constant Definitions: Exception Stuff
0000                 803 ;>
0000                 804 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 805 
0000 00 55           806 Apl_Ack         .Equ    $55 ;Acknowledge from Host
0000 00 01           807 Init_Response   .Equ    $01 ;Controller Ready for new command
0000 00 69           808 Free_Proc       .Equ    $69 ;Host willing to give up the bus
0000                 809 
0000 00 00           810 Apl_Excpt      .Equ    $00             ;Apple_Interface
0000 00 00           811  ChkB_Mismatch  .Equ    $00            ;Check Byte Mismatch
0000 00 01           812  Bad_Cmnd       .Equ    $01            ;Illegal Command
0000                 813 
0000 00 01           814 Cmnd_Excpt     .Equ    $01             ;Command_Driver
0000 00 00           815  Strt_Cmnd      .Equ    $00             ; Start_Command
0000                 816 
0000 00 02           817 LBlk_Bounds    .Equ    $02             ;Logical Block out-of-bounds
0000                 818 
0000 00 03           819 S_Rst_Abort    .Equ    $03             ;Servo Reset Abort
0000 00 00           820  Serr_NotReady  .Equ    $00      ;abort because NOT( ServoRdy ) OR ServoErr
0000 00 01           821  Comm_Err       .Equ    $01      ;abort because communication error
0000 00 00           822   S_Store        .Equ    $00     ;comm error in Servo Store
0000 00 01           823   S_Load         .Equ    $01     ;comm error in Servo Load
0000                 824   
0000 00 04           825 RdBlk_Abort     .Equ    $04     ;abort in ReadBlock
0000 00 05           826 RdHdr_Abort     .Equ    $05     ;abort in ReadHeader
0000 00 06           827 WrBlk_Abort     .Equ    $06     ;abort in WriteBlock
0000 00 07           828 FmtBlk_Abort    .Equ    $07     ;abort in FormatBlock
0000 00 00           829  Bad_State       .Equ    $00     ;abort caused by illegal state machine state
0000 00 08           830 FmtTrk_Abort    .Equ    $08     ;abort in FormatTrack
0000 00 00           831  FmtTrk_PosErr   .Equ    $00     ;abort because unable to position heads
0000                 832  
0000 00 09           833 SpareAbort      .Equ    $09     ;abort while trying to deal with spare table
0000 00 00           834  NoSpace         .Equ    $00     ;abort was caused by request for space
0000                 835  
0000 00 0A           836 Srvo_R_Abort    .Equ    $0A     ;abort while attempting Servo Recovery
0000                 837 
0000 00 0B           838 OvrLp_Abort     .Equ    $0B     ;abort while attempting overlapped seek
0000                 839 
0000 00 0C           840 Rd_Cmn_Abort    .Equ    $0C     ;abort while executing system read
0000 00 00           841  Servo_Dead      .Equ    $00     ;aborted because of servo failure
0000                 842  
0000 00 0D           843 Seek_Abort      .Equ    $0D     ;abort while executing a seek
0000                 844 
0000 00 0E           845 Wr_Cmn_Abort    .Equ    $0E     ;abort while executing Write_Common
0000                 846 
0000 00 0F           847 Bad_PassWord    .Equ    $0F     ;command string had wrond password
0000                 848 
0000 00 10           849 Bad_Params      .Equ    $10     ;command had illegal parameters
0000                 850 
0000 00 11           851 SprCnt_Abort    .Equ    $11     ;illegal spare count command





        WIDGET.ASSEM            Page  21
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000                 852 
0000 00 12           853 Host_OvrFlow    .Equ    $12     ;Host sent too much data!
0000                 854                 
























































        WIDGET.ASSEM            Page  22
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000                 855                 .Page
0000                 856 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 857 ;>
0000                 858 ;>      Constant Definitions: External Eprom Stuff
0000                 859 ;>
0000                 860 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 861 
0000 00 02           862 Pro_Cmnds       .Equ    02
0000 00 13           863 Diag_Cmnds      .Equ    19
0000 00 02           864 Sys_Cmnds       .Equ    02
0000                 865 
















































        WIDGET.ASSEM            Page  23
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0000                 866                 .Page
0000                 867 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 868 ;>
0000                 869 ;>      Constant Definitions: External Ram Stuff
0000                 870 ;>
0000                 871 ;>>>>>>>>>>>>>>>>>>>>>>>>
0000                 872 
0000                 873                 .ORG    $1000 
1000                 874                 
1000                 875 ReadArray:
1000 00 00 00 00     876 RSctrGap:        .Block  0,10
100A 00              877 RHdrGap:         .BlocK  0,1
100B 00 00 00 00     878 RHeader:         .Block  0,6
1011 00 00 00 00     879 RDataGap:        .Block  0,7
1018 00              880 RDummy:          .Block  0,1
1019 00 00 00 00     881 RBuffer1:        .Block  0,532
122D 00 00           882 RBuf1Crc:        .Block  0,2
122F 00 00 00 00     883 RBuf1Ecc:        .Block  0,6
1235 00              884 REndGap:         .Block  0,1
1236 00 00 00 00     885 RBuf1Pw:         .Block  0,4
123A                 886 
123A 02 00           887 BlockID         .Equ    512 ;offset of controller useable space
123A 10 15           888 StatusArray      .Equ   RBuffer1 - 4
123A                 889                 
123A                 890                 .ORG    $1000
1000                 891                 
1000                 892 ReadHdrArray:
1000 00 00 00 00     893 RHSctrGap:        .Block  0,10
100A 00 00           894 RHHdrGap:         .BlocK  0,2
100C 00 00 00 00     895 RHHeader:         .Block  0,6
1012 00 00 00 00     896 RHDataGap:        .Block  0,6
1018 00              897 RHDummy:          .Block  0,1
1019 00 00 00 00     898 RHBuffer1:        .Block  0,532
122D 00 00           899 RHBuf1Crc:        .Block  0,2
122F 00 00 00 00     900 RHBuf1Ecc:        .Block  0,6
1235 00              901 RHEndGap:         .Block  0,1
1236 00 00 00 00     902 RHBuf1Pw:         .Block  0,4
123A                 903                 
123A 10 08           904 RdH_Stat_Array  .Equ    RHHeader - 4
123A                 905 
123A                 906                 .ORG    $1000
1000                 907                 
1000                 908 WriteArray:
1000 00 00 00 00     909 WSctrGap:        .Block  0,10
100A 00              910 WHdrGap:         .BlocK  0,1
100B 00 00 00 00     911 WHeader:         .Block  0,6
1011 00 00 00 00     912 WDataGap:        .Block  0,14
101F 00 00           913 WDataSync:       .Block  0,2
1021 00 00 00 00     914 WBuffer1:        .Block  0,532
1235 00 00           915 WBuf1Crc:        .Block  0,2
1237 00 00 00 00     916 WBuf1Ecc:        .Block  0,6
123D 00 00           917 WEndGap:         .Block  0,2
123F 00 00 00 00     918 WBuf1Pw:         .Block  0,4
1243                 919                 





        WIDGET.ASSEM            Page  24
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1243                 920                 .ORG    $1000 + $20
1020                 921                 
1020                 922 FormatArray:
1020 00 00 00 00     923 FSctrGap:        .Block  0,10
102A 00 00 00 00     924 FHdrGap:         .BlocK  0,16
103A 00 00           925 FHdrSync:        .Block  0,2
103C 00 00 00 00     926 FHeader:         .Block  0,6
1042 00 00 00 00     927 FDataGap:        .Block  0,14
1050 00 00           928 FDataSync:       .Block  0,2
1052 00 00 00 00     929 FBuffer1:        .Block  0,532
1266 00 00           930 FBuf1Crc:        .Block  0,2
1268 00 00 00 00     931 FBuf1Ecc:        .Block  0,6
126E 00 00           932 FEndGap:         .Block  0,2
1270                 933 
1270 00 00 00 00     934 WBlkFence:      .Block  0,4 ;fence to check for host write overruns
1274 10 1A           935 Cmnd_Ptr         .Equ   WBuffer1-7 ;host passes command here!
1274                 936 
1274                 937 Buf2Array:
1274 00              938 BufDummy:       .Block  0,1
1275 00 00 00 00     939 Buffer2:        .Block  0,532
1489 00 00           940 Buf2Crc:        .Block  0,2
148B 00 00 00 00     941 Buf2Ecc:        .Block  0,6
1491 00 00 00 00     942 Buf2Pw2:        .Block  0,4
1495                 943 
1495 00 00 00 00     944 CStatus0:        .Block  0,4     ;Controller Status
1499 00 00 00 00     945 CStatus1:        .Block  0,4
149D 00 00 00 00     946 CStatus2:        .Block  0,4
14A1 00 00 00 00     947 CStatus3:        .Block  0,4    ;Last Requested Block Number
14A5 00 00 00 00     948 CStatus4:        .Block  0,4    ;Last Host Command: word0
14A9 00 00 00 00     949 CStatus5:        .Block  0,4    ;Last Host Command: word1
14AD 00 00 00 00     950 CStatus6:        .Block  0,4
14B1 14 B1           951 End_CStatus      .Equ   .PC.
14B1                 952 
14B1 14 A1           953 LogicalBlock    .Equ    CStatus3
14B1                 954 
14B1 00 00 00 00     955 SrvoCmndBuf:     .Block  0,5     ;Servo Command Buffer
14B6 00 05           956 S_Cmnd_Len       .Equ    5       ;Length of ServoCmndBuffer
14B6 00 00 00 00     957 SStatus0:        .Block  0,5     ;Servo Status
14BB                 958 
14BB                 959 SpareArray:
14BB 00 00 00 00     960 SparePw1:       .Block  0,4
14BF 00 00 00 00     961 SpareTmStmp:    .Block  0,4
14C3 00              962 FmtOffset:      .Block  0,1
14C4 00              963 FmtIntrL:       .Block  0,1
14C5 00 00 00 00     964 SegPtrArray:    .Block  0,128
1545 00              965 SprCount:       .Block  0,1
1546 00              966 BadCount:       .Block  0,1
1547 00 00 00 00     967 SpareBitMap:    .Block  0,10
1551 00 00 00 00     968 SpareTable:     .Block  0,304
1681 00 00 00 00     969 Map_Table:      .Block  0,NbrSctrs
1694 00 00           970 SpareCheck:     .Block  0,2
1696 00 00 00 00     971 SparePw2:       .Block  0,4
169A                 972 
169A 01 DF           973 SpareLength     .Equ    .PC.-SpareArray





        WIDGET.ASSEM            Page  25
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


169A 00 00 00 00     974 SpareEnd:       .Block  0,BlockLength-SpareLength
16D8                 975 
16D8 00 00 00 00     976 Abort_Stat:     .Block  0,16 ;last abort info
16E8                 977 
16E8 00 14           978 CacheLength     .Equ    NbrSctrs+1
16E8 00 00 00 00     979 CachStat:       .Block  0,CacheLength
16FC 00 00 00 00     980 CacheArray:     .Block  0,4*CacheLength
174C                 981 
174C 00 00           982 StackPtr:       .Block  0,2
174E 17 4E           983 Heap            .Equ    .PC.
174E                 984 
174E 17 4E           985 StartBlock      .Equ    Heap
174E 17 51           986 BlkOffset       .Equ    StartBlock+3
174E 17 52           987 BlkIndex        .Equ    BlkOffset+1
174E                 988 
174E 17 4E           989 PBlock          .Equ    Heap
174E 17 51           990 TLBlock         .Equ    PBlock+3
174E 17 54           991 Cur_THS         .Equ    TLBlock+3
174E                 992 
174E 17 FF           993 TopOfStack      .Equ    $17FF   ;top of external stack
174E                 994 






































        WIDGET.ASSEM            Page  26
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


174E                 995                 .Page
174E                 996 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
174E                 997 ;>
174E                 998 ;>      Interrupt Stuff
174E                 999 ;>
174E                1000 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
174E                1001 
174E 00 00          1002 Dmt_PosHeads    .Equ    $00
174E 00 01          1003 Dmt_C00         .Equ    $01       ;Command $00
174E 00 02          1004 Dmt_C01         .Equ    $02       ;Command $01
174E 00 03          1005 Dmt_C02         .Equ    $03       ;Command $02
174E 00 04          1006 Dmt_ReadBlock   .Equ    $04       ;Routine: ReadBlock
174E 00 05          1007 Dmt_ReadHdr     .Equ    $05       ;Routine: ReadHdr
174E 00 06          1008 Dmt_WriteBlock  .Equ    $06       ;Routine: WriteBlock
174E 00 07          1009 Dmt_FormatBlock .Equ    $07       ;Routine: FormatBlock
174E 00 08          1010 Dmt_FmtTrack    .Equ    $08       ;Routine: FormatTrack
174E 00 09          1011 Dmt_LctSctr     .Equ    $09       ;Routine: LocateSector
174E 00 0A          1012 Dmt_Recal       .Equ    $0A       ;Routine: Restore
174E 00 0B          1013 Dmt_WV          .Equ    $0B       ;Routine: WriteVerify
174E 00 0C          1014 Dmt_S_R         .Equ    $0C       ;Routine: ServoRecovery
174E 00 0D          1015 Dmt_OverLap     .Equ    $0D       ;Routine: OverLappedSeek
174E 00 0E          1016 Dmt_Rd_Common   .Equ    $0E       ;Routine: Read_Common
174E 00 0F          1017 Dmt_Seek        .Equ    $0F       ;Routine: Seek
174E 00 10          1018 Dmt_ServoOk     .Equ    $10       ;Routine: ServoOk
174E 00 11          1019 Dmt_Wr_Common   .Equ    $11       ;Routine: Write_Common
174E 00 12          1020 Dmt_TrkCnt      .Equ    $12       ;Routine: TrackCount
174E 00 13          1021 Dmt_S_Cmnd      .Equ    $13       ;Routine: ServoCmnd
174E 00 14          1022 Dmt_S_Stat      .Equ    $14       ;Routine: ServoStatus
174E 00 15          1023 Dmt_S_Store     .Equ    $15       ;Routine: ServoStore
174E 00 16          1024 Dmt_S_Load      .Equ    $16       ;Routine: ServoLoad
174E                1025 
174E 01 F4          1026 Dmt_Val         .Equ    500   ;DeadManTimer count
174E                1027 
174E                1028 ;> IRQ Definitions
174E                1029 
174E 00 20          1030 Timer1          .Equ    $20     ;Timer 1 interrupt
174E 00 10          1031 Timer0          .Equ    $10     ;Timer 0 interrupt
174E 00 10          1032 Serial_Out      .Equ    $10     ;Sio transmitter ready
174E 00 08          1033 Serial_In       .Equ    $08     ;Sio receiver ready
174E 00 04          1034 Irq_Sector      .Equ    $04     ;Negative edge on sector mark
174E 00 01          1035 Irq_Index       .Equ    $01     ;Negative edge on index mark
174E                1036 
174E                1037                 .LSTOFF
174E                1042                 .LSTON















        WIDGET.ASSEM            Page  27
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


174E                1043                 .Page
174E                1044 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
174E                1045 ;>
174E                1046 ;>      Module: Initialization
174E                1047 ;>
174E                1048 ;>      This module contains the routines that are responsible for
174E                1049 ;>      initializing widget.
174E                1050 ;>
174E                1051 ;>      RESIDENT PROCEDURE RegTest
174E                1052 ;>      RESIDENT PROCEDURE StackTest
174E                1053 ;>      RESIDENT FUNCTION RamTest : BOOLEAN
174E                1054 ;>      RESIDENT FUNCTION EpromTest : BOOLEAN
174E                1055 ;>      START PROCEDURE : Main
174E                1056 ;>
174E                1057 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
174E                1058                 .LSTOFF
174E                1061                 .LSTON










































        WIDGET.ASSEM            Page  28
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


174E                1062                 .Page
174E                1063                 .FIN
174E                1064                 
174E                1065                 .ORG    $0
0000                1066                 
0000 05 0D          1067 Int_Vec0:       .DW     Vector0
0002 05 0D          1068 Int_Vec1:       .DW     Vector1
0004 05 0D          1069 Int_Vec2:       .DW     Vector2
0006 05 0D          1070 Int_Vec3:       .DW     Vector3
0008 05 0D          1071 Int_Vec4:       .DW     Vector4
000A 05 16          1072 Int_Vec5:       .DW     Vector5
000C                1073                 
000C 8F           6 1074                 Di
000D 31 00        6 1075                 Srp     #Wrk_Io ;select I/O working register set 
000F B0 FE        6 1076                 Clr     Sph             ;initialize the stack
0011 E6 FF 80    10 1077                 Ld      Spl,#Stack_Top
0014                1078                 
0014 E6 F8 36    10 1079                 Ld      P01m,#P0_03_Adr+P0_47_Out+Stack_In+P1_Adr+Mem_Ext
0017 0C 70        6 1080                 Ld      !Port0,#Not_FmenL+Not_ZTestL+Not_RdHdrH+Not_ServoRst
0019                1081                 
0019 E6 F6 46    10 1082                 Ld      P2m,#P21_In+P22_In+P26_In
001C 2C 99        6 1083                 Ld      !Port2,#Not_StartL+Bsy+Z8_Mem+DrwL_Read
001E                1084 
001E E6 F7 51    10 1085                 Ld      P3m,#B0_7_Ser+B1_6_Io+B3_4_Idm+B2_5_Io+Totem_Pol+Par_Off
0021                1086                 
0021 EC 19        6 1087                 Ld      !rE,#.HIBYTE. RamBank0 ;select ram bank 1
0023 FC 01        6 1088                 Ld      !rF,#01
0025 92 EE       12 1089                 Lde     @!!rE,!rE
0027 EE           6 1090                 Inc     !rE ;set next Ram adr bit
0028 FC 00        6 1091                 Ld      !rF,#00
002A 92 EE       12 1092                 Lde     @!!rE,!rE
002C                1093                 
002C EC 10        6 1094                 Ld      !rE,#.HIBYTE. $1000 ;save PwrFlg regs temporarily
002E FC 00        6 1095                 Ld      !rF,#.LOWBYTE. $1000
0030 DC 04        6 1096                 Ld      !rD,#4 ;move 4 registers
0032 CC 2C        6 1097                 Ld      !rC,#PwrFlg0
0034 93 CE       18 1098 Start_Loop:     Ldei    @!!rE,@!rC
0036 DA FC          1099                 Djnz    !rD,Start_Loop
0038                1100                 
0038                1101                 .LSTOFF
0038                1103                 .LSTON


















        WIDGET.ASSEM            Page  29
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0038                1104                 .Page
0038                1105 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0038                1106 ;>
0038                1107 ;>      Diagnostic: Internal Ram/Register Test
0038                1108 ;>
0038                1109 ;>         This test is used as both a diagnostic and a selftest routine
0038                1110 ;>      in the Widget controller. It is intended to check the internal
0038                1111 ;>      functions of the Z8 before allowing the controller to execute
0038                1112 ;>      any code that could be potentially dangerous to the system.
0038                1113 ;>
0038                1114 ;>         The test begins by checking working register set 0, registers
0038                1115 ;>      4,5,6, and 7, then uses those registers to test the rest of the others.
0038                1116 ;>
0038                1117 ;>      Test: All Zeros/ All Ones
0038                1118 ;>
0038                1119 ;>      k := 0    { Load Value }
0038                1120 ;>      For l := 1 To 2 Do
0038                1121 ;>       Begin
0038                1122 ;>        i := 120  { 128 regs: -4 i/o ports, -4 regs used in test }
0038                1123 ;>        j := 127  { Highest register address }
0038                1124 ;>        While ( i > 0 ) Do
0038                1125 ;>         Begin
0038                1126 ;>          RamReg[ j ] := k
0038                1127 ;>          j := j - 1
0038                1128 ;>          i := i - 1
0038                1129 ;>         End { While }
0038                1130 ;>        For i := 1 To 120 Do
0038                1131 ;>         Begin
0038                1132 ;>          If RamReg[ j ] <> k Then HALT
0038                1133 ;>          j := j + 1
0038                1134 ;>         End
0038                1135 ;>        k := $FF { do all one's test next }
0038                1136 ;>       End { for }
0038                1137 ;>
0038                1138 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0038                1139                 .LSTOFF
0038                1142                 .LSTON






















        WIDGET.ASSEM            Page  30
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0038                1143                 .Page
0038                1144                 .FIN
0038                1145 
0038                1146  Start_RegTest:
0038                1147                 
0038 B0 E4        6 1148                 Clr     !r4
003A 42 44        6 1149                 Or      !r4,!r4         ;quick check
003C EB FE          1150                 Jr      Nz,.PC.         ;loop here if can't clear r4
003E                1151                 
003E 58 E4        6 1152                 Ld      !r5,!r4         ;bootstrap a few registers
0040 68 E4        6 1153                 Ld      !r6,!r4         ;    /|\
0042 78 E4        6 1154                 Ld      !r7,!r4         ;     |
0044 88 E4        6 1155                 Ld      !r8,!r4         ;     |
0046 02 54        6 1156                 Add     !r5,!r4         ;     | ( all zeros )
0048 02 65        6 1157                 Add     !r6,!r5         ;     |
004A 02 76        6 1158                 Add     !r7,!r6         ;     | 
004C 02 87        6 1159                 Add     !r8,!r7         ;    \|/
004E EB FE          1160                 Jr      Nz,.PC.         ;loop here if can't bootstrap
0050                1161                 
0050 4C FF        6 1162                 Ld      !r4,#$FF        ;quick check
0052 A6 E4 FF    10 1163                 Cp      !r4,#$FF
0055 EB FE          1164                 Jr      Nz,.PC.         ;loop here if can't set r4
0057                1165                 
0057 58 E4        6 1166                 Ld      !r5,!r4         ;bootstrap a few registers
0059 68 E4        6 1167                 Ld      !r6,!r4         ;    /|\
005B 78 E4        6 1168                 Ld      !r7,!r4         ;     |
005D 88 E4        6 1169                 Ld      !r8,!r4         ;     |
005F 02 54        6 1170                 Add     !r5,!r4         ;     | ( all ones )
0061 02 65        6 1171                 Add     !r6,!r5         ;     |
0063 02 76        6 1172                 Add     !r7,!r6         ;     | 
0065 02 87        6 1173                 Add     !r8,!r7         ;    \|/
0067 06 E8 05    10 1174                 Add     !r8,#5          ; 5*(-1) + 5 = 0
006A EB FE          1175                 Jr      Nz,.PC.         ;loop here if can't bootstrap
006C                1176                 

























        WIDGET.ASSEM            Page  31
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


006C                1177                 .Page
006C                1178 
006C                1179 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
006C                1180 ;>
006C                1181 ;>      Test the rest of the registers
006C                1182 ;>
006C                1183 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
006C                1184 
006C B0 E4        6 1185                 Clr     !r4             ;Load value
006E 5C 02        6 1186                 Ld      !r5,#RegLpTimes
0070                1187 
0070 88 E4        6 1188 RegLp1:         Ld      !r8,!r4         ;remember load value
0072 6C 77        6 1189                 Ld      !r6,#RegCount-RegUsed-I_ORegUsed
0074 7C 7F        6 1190                 Ld      !r7,#HiRegAdr
0076                1191                 
0076 F3 74        6 1192 RegLp2:         Ld      @!r7,!r4        ;begin loading ram
0078 00 E7        6 1193                 Dec     !r7             ;point to new reg
007A 6A FA          1194                 Djnz    !r6,RegLp2
007C                1195                 
007C 6C 77        6 1196                 Ld      !r6,#RegCount-RegUsed-I_ORegUsed
007E                1197                 
007E 7E           6 1198 RegLp3:         Inc     !r7
007F E3 47        6 1199                 Ld      !r4,@!r7        ;Read regs
0081 A2 48        6 1200                 Cp      !r4,!r8
0083 EB FE          1201                 Jr      Nz,.PC.         ;Loop here if failure
0085                1202                 
0085 6A F7          1203                 Djnz    !r6,RegLp3
0087                1204                 
0087 4C FF        6 1205                 Ld      !r4,#$FF        ;set up for all ones test
0089 5A E5          1206                 Djnz    !r5,RegLp1
008B                1207                 
008B                1208                 .LSTOFF
008B                1210                 .LSTON


























        WIDGET.ASSEM            Page  32
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


008B                1211                 .Page
008B                1212                 
008B                1213 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
008B                1214 ;>
008B                1215 ;>      Diagnostic: Stack Test
008B                1216 ;>
008B                1217 ;>      This test is used to test the Z8's push and pop capabilities
008B                1218 ;>      as well as it's ability to perform calls and returns.
008B                1219 ;>
008B                1220 ;>      The stack is set to internal, and the stack top is set to
008B                1221 ;>      location $80. The ensuing PUSH instruction first decrements the
008B                1222 ;>      stack pointer to $7F, and then store the contents of the 
008B                1223 ;>      register being pushed in that location. A pop instruction
008B                1224 ;>      should first load the register with the contents pointed
008B                1225 ;>      to by the stack pointer and then increment the pointer.
008B                1226 ;>
008B                1227 ;>      Registers Used: r4, r5
008B                1228 ;>
008B                1229 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
008B                1230                 .LSTOFF
008B                1233                 .LSTON






































        WIDGET.ASSEM            Page  33
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


008B                1234                 .Page
008B                1235                 .FIN
008B                1236 
008B B0 FE        6 1237                 Clr     Sph
008D E6 FF 80    10 1238                 Ld      Spl,#$80
0090                1239                 
0090 48 FE        6 1240                 Ld      !r4,Sph
0092 EB FE          1241                 Jr      Nz,.PC.         ;check the loading of Stack Pointer
0094                1242                 
0094 A6 FF 80    10 1243                 Cp      Spl,#$80
0097 EB FE          1244                 Jr      Nz,.PC.
0099                1245                 
0099 4C AA        6 1246                 Ld      !r4,#$AA         ;Push/Pop $AA
009B 70 E4          1247                 Push    !r4
009D 48 FE        6 1248                 Ld      !r4,Sph
009F EB FE          1249                 Jr      Nz,.PC.         ;check for decrement of pointer
00A1                1250                 
00A1 A6 FF 7F    10 1251                 Cp      Spl,#$7F
00A4 EB FE          1252                 Jr      Nz,.PC.
00A6                1253                 
00A6 50 E4       10 1254                 Pop     !r4
00A8 A6 E4 AA    10 1255                 Cp      !r4,#$AA
00AB EB FE          1256                 Jr      Nz,.PC.
00AD                1257                 
00AD 48 FE        6 1258                 Ld      !r4,Sph
00AF EB FE          1259                 Jr      Nz,.PC.         ;check for increment of pointer
00B1                1260                 
00B1 A6 FF 80    10 1261                 Cp      Spl,#$80
00B4 EB FE          1262                 Jr      Nz,.PC.
00B6                1263                 
00B6 D6 00 B9    20 1264                 Call    Stk_Test        ;check call capability
00B9 48 FF        6 1265 Stk_Test:       Ld      !r4,Spl
00BB A6 E4 7E    10 1266 Stk_Test1:      Cp      !r4,#$7E        ;check for double dec on call
00BE EB FE          1267                 Jr      Nz,.PC.
00C0                1268                 
00C0 4E           6 1269                 Inc     !r4             ;point to low address byte
00C1 E3 54        6 1270                 Ld      !r5,@!r4        ;load low address byte
00C3 A6 E5 B9    10 1271                 Cp      !r5,#StkTest    ;should be next instruction after call
00C6 EB FE          1272                 Jr      Nz,.PC.
00C8                1273                 
00C8 E7 E4 CE     6 1274                 Ld      @!r4,#Stk_Ret   ;check return capability
00CB AF          14 1275                 Ret
00CC 8B FE          1276 Stk_Halt:       Jr      Stk_Halt        ;Halt if pc just got incremented
00CE                1277                 
00CE B0 FE        6 1278 Stk_Ret:        Clr     Sph             ;initialize the stack
00D0 E6 FF 80    10 1279                 Ld      Spl,#Stack_Top
00D3                1280                 
00D3                1281                 .LSTOFF
00D3                1283                 .LSTON










        WIDGET.ASSEM            Page  34
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


00D3                1284                 .Page
00D3                1285 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
00D3                1286 ;>
00D3                1287 ;>      Initialize the i/o port control registers
00D3                1288 ;>
00D3                1289 ;>      P01m -->
00D3                1290 ;>              Select Port 0, Bits 0:3 = Adr Bits 8:11
00D3                1291 ;>              Select Port 0, Bits 4:7 = Output Ports
00D3                1292 ;>              Select Port 1 = Adr Bits 0:7
00D3                1293 ;>              Select Extended Memory Timing
00D3                1294 ;>              Select Internal Stack
00D3                1295 ;>
00D3                1296 ;>      P2m  -->
00D3                1297 ;>              Select Port 2, Bit 2 = Input
00D3                1298 ;>              Select Port 2, Bit 6 = Input
00D3                1299 ;>              All other Port 2 Bits are outputs
00D3                1300 ;>
00D3                1301 ;>      P3m  -->
00D3                1302 ;>              Select Port 3, Bit 0 = Sio Data In
00D3                1303 ;>              Select Port 3, Bit 1 = Tin
00D3                1304 ;>              Select Port 3, Bit 2 = Input
00D3                1305 ;>              Select Port 3, Bit 3 = Input
00D3                1306 ;>              Select Port 3, Bit 4 = Dm-
00D3                1307 ;>              Select Port 3, Bit 5 = Output
00D3                1308 ;>              Select Port 3, Bit 6 = Tout
00D3                1309 ;>              Select Port 3, Bit 7 = Sio Data Out
00D3                1310 ;>              Select Sio Parity Off
00D3                1311 ;>              Select Totem-Pole outputs for Port 2
00D3                1312 ;>
00D3                1313 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
00D3                1314                 .LSTOFF
00D3                1317                 .LSTON



























        WIDGET.ASSEM            Page  35
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


00D3                1318                 .Page
00D3                1319                 .FIN
00D3                1320                 
00D3 4C 16        6 1321                 Ld      !P01m_Image,#P0_03_Adr+P0_47_Out+Stack_In+P1_Adr
00D5 6C 1C        6 1322                 Ld      !P01m_StMach,#P0_03_Out+P0_47_Out+Stack_In+P1_Tri
00D7 49 F8        6 1323                 Ld      P01m,!P01m_Image
00D9                1324                 
00D9 E6 F6 46    10 1325                 Ld      P2m,#P21_In+P22_In+P26_In
00DC                1326 
00DC 5C 51        6 1327                 Ld      !P3m_Image,#B0_7_Ser+B1_6_Io+B3_4_Idm+B2_5_Io+Totem_Pol+Par_Off
00DE 7C 41        6 1328                 Ld      !P3m_StMach,#B0_7_Ser+B1_6_Io+B3_4_Io+B2_5_Io+Totem_Pol+Par_Off
00E0 59 F7        6 1329                 Ld      P3m,!P3m_Image
00E2                1330                 
00E2 8C EF        6 1331                 Ld      !Dm_Mask,#$FF-Dm
00E4 9C FE        6 1332                 Ld      !Start_Mask,#$FF-Not_StartL
00E6                1333                 
00E6 E6 F9 08    10 1334                 Ld      Ipr,#$08 ;GroupA := 0, A>B>C
00E9 B0 FB        6 1335                 Clr     Imr     ;disallow interrupts
00EB B0 FA        6 1336                 Clr     Irq     ;clear any pending interrupts
00ED                1337                 
00ED B0 56        6 1338                 Clr     DiskStat
00EF B0 24        6 1339                 Clr     Excpt_Stat ;Recovery Off
00F1 B0 5A        6 1340                 Clr     BlkStat
00F3 B0 26        6 1341                 Clr     RdStat
00F5 B0 27        6 1342                 Clr     RdErrCnt
00F7 B0 28        6 1343                 Clr     WrStat
00F9 B0 29        6 1344                 Clr     WrErrCnt
00FB B0 5B        6 1345                 Clr     Cache_Index
00FD E6 57 90    10 1346                 Ld      Seek_Type,#Access_Offset
0100 E6 58 02    10 1347                 Ld      Data_Type,#User_Type
0103 B0 2A        6 1348                 Clr     SeekCount
0105 B0 2B        6 1349                 Clr     SeekCount+1
0107                1350                 
0107 EC 10        6 1351                 Ld      !rE,#.HIBYTE. Rwi_Value ;load RWI/PC cylinder value
0109 FC 08        6 1352                 Ld      !rF,#.LOWBYTE. Rwi_Value
010B CC 20        6 1353                 Ld      !rC,#Hi_Rwi_Reg
010D C3 CE       18 1354                 Ldci    @!rC,@!!rE
010F C3 CE       18 1355                 Ldci    @!rC,@!!rE
0111                1356                 
0111 B0 F1        6 1357                 Clr     Tmr ;initialize timers
0113 E6 F3 03    10 1358                 Ld      Pre1,#$3 ;Mod-64, continuos run
0116 E6 F2 8F    10 1359                 Ld      T1,#143 ;interrupt every 10 ms
0119 46 F1 0C    10 1360                 Or      Tmr,#T1_CntEn + T1_Load
011C                1361                 
011C 9F           6 1362                 Ei              ;kludge for Z8 to do polling
011D 8F           6 1363                 Di
011E E6 FB 20    10 1364                 Ld      Imr,#Timer1 ;allow only Timer1 interrupts
0121                1365                 
0121                1366                 .LSTOFF
0121                1368                 .LSTON









        WIDGET.ASSEM            Page  36
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0121                1369                 .Page
0121                1370 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0121                1371 ;>
0121                1372 ;>      Initial Port Assignments
0121                1373 ;>
0121                1374 ;>      Port 0 -->
0121                1375 ;>              Bits 0:3 are set to Adr 8:11 via P01m
0121                1376 ;>              Bit 4 = Servo Reset Active
0121                1377 ;>              Bit 5 = Format Enable Inactive
0121                1378 ;>              Bit 6 = Z8 Test Inactive
0121                1379 ;>              Bit 7 = Read Header Inactive
0121                1380 ;>
0121                1381 ;>      Port 1 -->
0121                1382 ;>              Bits 0:7 are set to Adr 0:7 via P01m
0121                1383 ;>
0121                1384 ;>      Port 2 -->
0121                1385 ;>              Bit 0 = Start Inactive
0121                1386 ;>              Bit 1 = Ecc Error Inactive
0121                1387 ;>              Bit 2 = don't care { input }
0121                1388 ;>              Bit 3 = Busy Active
0121                1389 ;>              Bit 4:5 = Msel0,1: Z8 <--> Mem
0121                1390 ;>              Bit 6 = don't care { input }
0121                1391 ;>              Bit 7 = Disk Read/Write: Read
0121                1392 ;>
0121                1393 ;>      Port 3 -->
0121                1394 ;>              Don't Care
0121                1395 ;>
0121                1396 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0121                1397                 .LSTOFF
0121                1400                 .LSTON





























        WIDGET.ASSEM            Page  37
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0121                1401                 .Page
0121                1402                 .FIN
0121                1403 
0121 0C 70        6 1404                 Ld      !Port0,#Not_ServoRst+Not_FmenL+Not_ZTestL+Not_RdHdrH
0123 2C 99        6 1405                 Ld      !Port2,#Not_StartL+Bsy+Z8_Mem+DrwL_Read
0125                1406                 
0125 31 10        6 1407                 Srp     #Wrk_Sys     ;context switch
0127                1408                 
0127 D6 02 00    20 1409                 Call    Clr_BankSwitch
012A                1410                 
012A 46 24 10    10 1411                 Or      Excpt_Stat,#PwrRst ;assume a power reset
012D 2C 10        6 1412                  Ld     !r2,#.HIBYTE. $1000 ;check saved power flags
012F 3C 00        6 1413                  Ld     !r3,#.LOWBYTE. $1000
0131 EC 10        6 1414                  Ld     !rE,#.HIBYTE. PassWord
0133 FC 03        6 1415                  Ld     !rF,#.LOWBYTE. PassWord
0135 4C 04        6 1416                  Ld     !r4,#4 ;check 4 bytes
0137                1417                  
0137 82 02       12 1418 PwrRst_Lp:      Lde     !r0,@!!r2 ;get save byte
0139 C2 1E       12 1419                 Ldc     !r1,@!!rE ;get a byte of password
013B A0 E2       10 1420                 Incw    !!r2
013D A0 EE       10 1421                 Incw    !!rE
013F A2 01        6 1422                 Cp      !r0,!r1
0141 EB 05          1423                 Jr      Nz,Power_On
0143 4A F2          1424                 Djnz    !r4,PwrRst_Lp
0145                1425                 
0145 56 24 EF    10 1426                 And     Excpt_Stat,#$FF-PwrRst
0148                1427 
0148 E6 38 07    10 1428 Power_On:       Ld      Scr_Cntr,#.HIBYTE. 2000
014B E6 39 D0    10 1429                 Ld      Scr_Cntr+1,#.LOWBYTE. 2000
014E                1430                 
014E E6 2C F0    10 1431                 Ld      PwrFlg0,#$F0 ;initialize power-on flags
0151 E6 2D 78    10 1432                 Ld      PwrFlg1,#$78
0154 E6 2E 3C    10 1433                 Ld      PwrFlg2,#$3C
0157 E6 2F 1E    10 1434                 Ld      PwrFlg3,#$1E
015A 8D 02 19       1435                 Jp      Main            ;go to main routine
015D                1436                 
015D                1437                 .LSTOFF
015D                1439                 .LSTON





















        WIDGET.ASSEM            Page  38
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


015D                1440                 .Page
015D                1441 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
015D                1442 ;>
015D                1443 ;>      Function: External Ram Test
015D                1444 ;>
015D                1445 ;>         This test is used as both a diagnostic and a selftest routine
015D                1446 ;>      in the Widget controller. It is intended to check the external ram
015D                1447 ;>      of the controller before allowing the controller to execute
015D                1448 ;>      any code that could be potentially dangerous to the system.
015D                1449 ;>
015D                1450 ;>      Inputs:
015D                1451 ;>              { none }
015D                1452 ;>
015D                1453 ;>      Outputs:
015D                1454 ;>              ExternalRamTest : BOOLEAN { Zero flag false if error }
015D                1455 ;>
015D                1456 ;>      Test: All Zeros/ All Ones
015D                1457 ;>
015D                1458 ;>      k := $FF    { Load Value }
015D                1459 ;>      For j := 1 To 2 Do
015D                1460 ;>       Begin
015D                1461 ;>        Dec_Scr_Cntr
015D                1462 ;>        i := RamSize
015D                1463 ;>        RamPtr := RamSize - 1
015D                1464 ;>        While i <> 0 Do
015D                1465 ;>         Begin
015D                1466 ;>          Ram[ RamPtr] := k
015D                1467 ;>          RamPtr := RamPtr - 1
015D                1468 ;>          i := i - 1
015D                1469 ;>         End
015D                1470 ;>        i := RamSize
015D                1471 ;>        While i <> 0 Do
015D                1472 ;>         Begin
015D                1473 ;>          If ( Ram[ RamPtr] = k ) Then HALT
015D                1474 ;>          RamPtr := RamPtr + 1
015D                1475 ;>          i := i - 1
015D                1476 ;>         End
015D                1477 ;>        k := $00 { do all zero's test next }
015D                1478 ;>       End
015D                1479 ;>
015D                1480 ;>   RamSize = 2048
015D                1481 ;>   k = r5
015D                1482 ;>   j = r8
015D                1483 ;>   i = r6,r7
015D                1484 ;>   RamPtr = rA,rB
015D                1485 ;>   scratch reg = r4
015D                1486 ;>
015D                1487 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
015D                1488                 .LSTOFF
015D                1491                 .LSTON









        WIDGET.ASSEM            Page  39
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


015D                1492                 .Page
015D                1493                 .FIN
015D                1494                 
015D                1495 RamTest:
015D 4C FF        6 1496                 Ld      !r4,#$FF             ;Load value
015F 8C 02        6 1497                 Ld      !r8,#RamLpTimes
0161                1498                 
0161 D6 01 EB    20 1499 RamLp1:         Call    Dec_Scr_Cnt
0164                1500 
0164 58 E4        6 1501                 Ld      !r5,!r4         ;remember load value
0166 7C 00        6 1502                 Ld      !r7,#.LOWBYTE. RamSize
0168 6C 08        6 1503                 Ld      !r6,#.HIBYTE. RamSize
016A BC FF        6 1504                 Ld      !rB,#.LOWBYTE. HiRamAdr ;Initialize Ram Ptr
016C AC 17        6 1505                 Ld      !rA,#.HIBYTE. ( HiRamAdr+RamOffset )
016E                1506                 
016E 92 4A       12 1507 RamLp2:         Lde     @!!rA,!r4       ;begin loading ram
0170 80 EA       10 1508                 Decw    !!rA            ;Point to next Ram location
0172 7A FA          1509                 Djnz    !r7,RamLp2
0174 6A F8          1510                 Djnz    !r6,RamLp2
0176                1511                 
0176 6C 08        6 1512                 Ld      !r6,#.HIBYTE. RamSize
0178                1513 
0178 A0 EA       10 1514 RamLp3:         Incw    !!rA            ;Point to next Ram location to check
017A 82 4A       12 1515                 Lde     !r4,@!!rA       ;Read regs
017C A2 45        6 1516                 Cp      !r4,!r5
017E EB 08          1517                 Jr      Nz,RamTestExit  ;Loop here if failure
0180 7A F6          1518                 Djnz    !r7,RamLp3
0182 6A F4          1519                 Djnz    !r6,RamLp3
0184                1520                 
0184 4C 00        6 1521                 Ld      !r4,#$00        ;set up for all ones test
0186 8A D9          1522                 Djnz    !r8,RamLp1
0188 AF          14 1523 RamTestExit:    Ret
0189                1524                 
0189                1525                 .LSTOFF
0189                1527                 .LSTON
























        WIDGET.ASSEM            Page  40
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0189                1528                 .Page
0189                1529 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0189                1530 ;>
0189                1531 ;>   Function: Eprom Test
0189                1532 ;>
0189                1533 ;>     This test is used as both as diagnostic for the external eprom
0189                1534 ;>   for the Widget Controller and as a selftest routine in the same
0189                1535 ;>   units system firmware.
0189                1536 ;>
0189                1537 ;>     The first location in the external eprom holds one byte that
0189                1538 ;>   is the check byte for that eprom. the check byte is calculated by
0189                1539 ;>   adding then shifting each byte in the eprom:
0189                1540 ;>
0189                1541 ;>      Inputs:
0189                1542 ;>              TopBank : BYTE { !r0 }
0189                1543 ;>
0189                1544 ;>      Outputs:
0189                1545 ;>              EpromTest : BOOLEAN { zero flag false if error }
0189                1546 ;>
0189                1547 ;>      Algorithm:
0189                1548 ;>
0189                1549 ;>      BEGIN
0189                1550 ;>       FOR Both Halves of the Eprom Do
0189                1551 ;>        Sum := 0
0189                1552 ;>        Sum := Sum + 256*Eprom[ 0 ]
0189                1553 ;>        FOR i := 1 TO MaxEpromAddress DO
0189                1554 ;>         Dec_Scr_Cntr
0189                1555 ;>         Sum := Sum + Eprom[ i ]
0189                1556 ;>        IF ( Sum = 0 )
0189                1557 ;>         THEN EpromTest := True
0189                1558 ;>         ELSE EpromTest := False
0189                1559 ;>
0189                1560 ;>      { note that the check byte is stored in the first two locations
0189                1561 ;>        of the eprom }
0189                1562 ;>
0189                1563 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0189                1564                 .LSTOFF
0189                1567                 .LSTON





















        WIDGET.ASSEM            Page  41
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0189                1568                 .Page
0189                1569                 .FIN
0189                1570         
0189                1571 EpromTest:
0189 48 E0        6 1572                 Ld      !r4,!r0 ;make a loop counter out of highaddress
018B                1573                 
018B 08 E4        6 1574 E_Lp:            Ld     !r0,!r4 ;get bank to test
018D F0 E0        8 1575                  Swap   !r0 ;turn loop count back into highaddress
018F D6 04 BE    20 1576                 Call    LookUp_Rom ;select that bank
0192                1577                 
0192 B0 E6        6 1578                 Clr     !r6 ;Sum := 0
0194 B0 E7        6 1579                 Clr     !r7
0196 8C 10        6 1580                 Ld      !r8,#.HIBYTE. EpromSize
0198 9C 00        6 1581                 Ld      !r9,#.LOWBYTE. EpromSize
019A                1582                 
019A CC 10        6 1583                 Ld      !rC,#.HIBYTE. EpromOffset
019C DC 00        6 1584                 Ld      !rD,#.LOWBYTE. EpromOffset
019E                1585                 
019E C2 0C       12 1586                 Ldc     !r0,@!!rC ;get Eprom[ 0 ]
01A0 60 E0        6 1587                 Com     !r0
01A2 02 60        6 1588                 Add     !r6,!r0   ;Sum := Sum + 256*Eprom[ 0 ]
01A4                1589                 
01A4 A0 EC       10 1590                 Incw    !!rC ;point to Eprom[ 1 ]
01A6 00 E9        6 1591                 Dec     !r9 ; account for Eprom[ 0 ]
01A8                1592                 
01A8 C2 0C       12 1593                 Ldc     !r0,@!!rC ;get Eprom[ 1 ]
01AA 60 E0        6 1594                 Com     !r0
01AC 02 70        6 1595                 Add     !r7,!r0   ;Sum := Sum + Eprom[ 1 ]
01AE                1596                 
01AE A0 E6       10 1597                 Incw    !!r6 ;do two's complement arithmetic
01B0                1598                 
01B0 A0 EC       10 1599                 Incw    !!rC ;point to Eprom[ 2 ]
01B2 00 E9        6 1600                 Dec     !r9 ; account for Eprom[ 1 ]
01B4                1601                 
01B4 D6 01 EB    20 1602 Eprom_Lp:       Call    Dec_Scr_Cntr
01B7 C2 0C       12 1603                 Ldc     !r0,@!!rC ;get Eprom[ i ]
01B9 A0 EC       10 1604                 Incw    !!rC
01BB 02 70        6 1605                 Add     !r7,!r0 ;Sum := Sum + Eprom[ i ]
01BD 16 E6 00    10 1606                 Adc     !r6,#0
01C0 9A F2          1607                 Djnz    !r9,Eprom_Lp
01C2 8A F0          1608                 Djnz    !r8,Eprom_Lp
01C4 EB 02          1609                 Jr      Nz,Eprom_End
01C6                1610                 
01C6 4A C3          1611                 Djnz    !r4,E_Lp
01C8                1612                 
01C8 8D 04 F8       1613 Eprom_End:      Jp      Bank_Ret
01CB                1614 
01CB                1615                 .LSTOFF
01CB                1617                 .LSTON










        WIDGET.ASSEM            Page  42
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


01CB                1618                 .Page
01CB                1619 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
01CB                1620 ;>
01CB                1621 ;>      Procedure: MsWait
01CB                1622 ;>
01CB                1623 ;>      This procedure is used as a software timing loop, where
01CB                1624 ;>      the busy wait length is equal to .01 * InputValue in seconds.
01CB                1625 ;>      ( one unit wait = 10 ms ).
01CB                1626 ;>
01CB                1627 ;>      Inputs:
01CB                1628 ;>              WaitLength : WORD { !!r2 }
01CB                1629 ;>
01CB                1630 ;>      Outputs: { none }
01CB                1631 ;>
01CB                1632 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
01CB                1633                 .LSTOFF
01CB                1636                 .LSTON










































        WIDGET.ASSEM            Page  43
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


01CB                1637                 .Page
01CB                1638                 .FIN
01CB                1639 
01CB                1640 MsWait:
01CB 0C 0A        6 1641                 Ld      !r0,#10 ;change LED every 100 ms
01CD 56 FA DF    10 1642 MsWait_1:       And     Irq,#$FF-Timer1 ;clear any pending times
01D0                1643                 
01D0 76 FA 20    10 1644 MsWait_Lp:      Tm      Irq,#Timer1 ;wait for timer int
01D3 6B FB          1645                 Jr      Z,MsWait_Lp
01D5                1646                 
01D5 00 E0        6 1647                 Dec     !r0
01D7 EB 0D          1648                 Jr      Nz,MsWait_Dec
01D9                1649                 
01D9 70 E2          1650                 Push    !r2 ;save counter
01DB 70 E3          1651                 Push    !r3
01DD D6 03 ED    20 1652                 Call    Invert_Led
01E0 50 E3       10 1653                 Pop     !r3
01E2 50 E2       10 1654                 Pop     !r2
01E4 0C 0A        6 1655                 Ld      !r0,#10
01E6                1656 
01E6 80 E2       10 1657 MsWait_Dec:     Decw    !!r2 ;count down a unit
01E8 EB E3          1658                 Jr      Nz,MsWait_1
01EA                1659                 
01EA AF          14 1660                 Ret
01EB                1661                 
01EB                1662                 
01EB 76 FA 20    10 1663 Dec_Scr_Cntr:   Tm      Irq,#Timer1 ;wait for timer interrupt
01EE 6B 0F          1664                 Jr      Z,Dec_Scr_End
01F0                1665                 
01F0 D6 03 ED    20 1666                 Call    Invert_Led
01F3 56 FA DF    10 1667                 And     Irq,#$FF-Timer1 ;get rid of old interrupt
01F6 08 38        6 1668                 Ld      !r0,Scr_Cntr ;check for already zero count
01F8 44 39 E0    10 1669                 Or      !r0,Scr_Cntr+1
01FB 6B 02          1670                 Jr      Z,Dec_Scr_End
01FD                1671                 
01FD 80 38       10 1672                 Decw    Scr_Cntr
01FF AF          14 1673 Dec_Scr_End:    Ret
0200                1674 
0200                1675 
0200 2C 18        6 1676 Clr_BankSwitch: Ld      !r2,#.HIBYTE. BankReg
0202 3C 00        6 1677                 Ld      !r3,#.LOWBYTE. BankReg
0204 1C 07        6 1678                 Ld      !r1,#7 ;clear 7 bits
0206 92 22       12 1679 Clr_B_Lp:       Lde     @!!r2,!r2
0208 2E           6 1680                 Inc     !r2 ;next bit's adr is $100 above last one
0209 1A FB          1681                 Djnz    !r1,Clr_B_Lp
020B                1682                 
020B 08 24        6 1683                 Ld      !r0,Excpt_Stat ;clear all but LED state
020D 56 E0 01    10 1684                 And     !r0,#$FF-Led_Mask
0210 D6 03 E0    20 1685                 Call    Set_Led
0213                1686                 
0213 0C 01        6 1687                  Ld     !r0,#Ram1
0215 D6 03 B3    20 1688                 Call    Set_RamBank
0218 AF          14 1689                 Ret
0219                1690 





        WIDGET.ASSEM            Page  44
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0219                1691                 .LSTOFF
0219                1693                 .LSTON

























































        WIDGET.ASSEM            Page  45
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0219                1694                 .Page
0219                1695 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0219                1696 ;>
0219                1697 ;>      Start_Procedure: Main
0219                1698 ;>
0219                1699 ;>      Inputs: { none }
0219                1700 ;>
0219                1701 ;>      Outputs: { none }
0219                1702 ;>
0219                1703 ;>      Algorithm:
0219                1704 ;>
0219                1705 ;>      BEGIN
0219                1706 ;>       SlfTst_Result := { assume all tests fail }
0219                1707 ;>       SlfTst_Result.RamTest := RamTest
0219                1708 ;>       SlfTst_Result.EpromTest := EpromTest
0219                1709 ;>       Init_ExtStack
0219                1710 ;>       ZeroBlock( ReadArray )
0219                1711 ;>       ClearStatus
0219                1712 ;>       Load_PassWord( WBlkFence )
0219                1713 ;>       SelfTest
0219                1714 ;>       IF system passed selftest
0219                1715 ;>        THEN 
0219                1716 ;>             Recovery is turned ON
0219                1717 ;>             Load_SprTbl
0219                1718 ;>             Load_Cache
0219                1719 ;>             IF SystemCode THEN Scan
0219                1720 ;>        ELSE Recovery is turned OFF
0219                1721 ;>       Clr_Bsy( Init_Response, Not( Cmnd_Pending )
0219                1722 ;>      END
0219                1723 ;>
0219                1724 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0219                1725                 .LSTOFF
0219                1728                 .LSTON


























        WIDGET.ASSEM            Page  46
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0219                1729                 .Page
0219                1730                 .FIN
0219                1731 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0219                1732 ;>
0219                1733 ;>      MAIN
0219                1734 ;>
0219                1735 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0219                1736 
0219                1737 Main:
0219 E6 25 FF    10 1738                 Ld      SlfTst_Result,#$FF ;assume all failures at first
021C                1739                 
021C D6 01 5D    20 1740                 Call    RamTest         ;test external ram
021F EB 03          1741                 Jr      Nz,Main_Eprom    
0221 56 25 7F    10 1742                 And     SlfTst_Result,#$FF-Ram_Fail
0224                1743                 
0224 0C 02        6 1744 Main_Eprom:      Ld     !r0,#Eprom2
0226 D6 01 89    20 1745                 Call    EpromTest       ;test external eprom bank 0,1
0229 EB 03          1746                 Jr      Nz,Main_SelfTst
022B 56 25 BF    10 1747                 And     SlfTst_Result,#$FF-Eprom_Fail
022E                1748                 
022E D6 10 29    20 1749 Main_SelfTst:    Call    ExtStk_Vector ;init external stack
0231                1750 
0231 EC 12        6 1751                  Ld     !rE,#.HIBYTE. WBlkFence
0233 FC 70        6 1752                  Ld     !rF,#.LOWBYTE. WBlkFence
0235 D6 10 19    20 1753                 Call    LdPw_Vector ;set write buffer fence
0238                1754                 
0238 D6 10 39    20 1755                 Call    ClrStat_Vector ;clear all status'
023B                1756                 
023B D6 10 41    20 1757                 Call    SlfTst_Vector ;perform selftest
023E                1758                 
023E 76 25 FE    10 1759 Main_LdSpr:     Tm      SlfTst_Result,#$FF-No_SprTbl
0241 6B 05          1760                 Jr      Z,Main_Set_R
0243 56 24 7F    10 1761                 And     Excpt_Stat,#$FF-Recovery ;THEN Recovery is off
0246 8B 0C          1762                 Jr      Main_Lp1
0248                1763                 
0248 46 24 80    10 1764 Main_Set_R:     Or      Excpt_Stat,#Recovery ;ELSE it is ON
024B                1765 
024B D6 10 49    20 1766                 Call    SprTbl_Vector
024E                1767                 
024E D6 10 51    20 1768 Main_Cache:     Call    LC_Vector
0251                1769                 
0251 D6 10 63    20 1770                 Call    IScan_Vector
0254                1771 
0254 D6 02 00    20 1772 Main_Lp1:       Call    Clr_BankSwitch
0257 D6 29 FD    20 1773                 Call    Set_SeekNeeded
025A                1774                  
025A E6 0A 01    10 1775                  Ld    Wrk_Io+$A,#Init_Response
025D B0 0B        6 1776                  Clr   Wrk_Io+$B ;Cmnd_Pending, IBsy := False
025F                1777 
025F                1778 ;               \ /     ;in-line code, must be followed by Clr_Bsy
025F                1779 
025F                1780                 .LSTOFF
025F                1785                 .LSTON






        WIDGET.ASSEM            Page  47
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


025F                1786                 .Page
025F                1787 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
025F                1788 ;>
025F                1789 ;>      Module: Resident
025F                1790 ;>
025F                1791 ;>      This module contains all the routines ( besides the Z8 initialization
025F                1792 ;>      procedures ) that must be resident within the Z8.
025F                1793 ;>
025F                1794 ;>      RESIDENT PROCEDURE Bsy_Clr( MemAdr : PTR { !!Wrk_Io+C } )
025F                1795 ;>                                  Response     : BYTE { Wrk_Io+$A }
025F                1796 ;>                                  Cmnd_Pending : BIT { Wrk_Io+$B/Bit 7 }
025F                1797 ;>                                  IBsy         : BIT { Wrk_Io+$B/Bit 6 }
025F                1798 ;>                                )
025F                1799 ;>      RESIDENT PROCEDURE Wait_Cmd( Cmnd_Pending : BOOLEAN { !rB/bit 7 }
025F                1800 ;>                                   Response : BYTE { !rA }
025F                1801 ;>                                   IBsy     : BOOLEAN { !rB/bit 6 }
025F                1802 ;>                                   MemAdr   : PTR { !!rC }
025F                1803 ;>                                 )
025F                1804 ;>      RESIDENT PROCEDURE Get_Wr_Data( Response : BYTE { !r9 } )
025F                1805 ;>      RESIDENT PROCEDURE Ack_Read( Response )
025F                1806 ;>      RESIDENT FUNCTION Wr_Resident : Status : BYTE { !r0 }
025F                1807 ;>      RESIDENT FUNCTION Fmt_Resident : Status : BYTE { !r0 }
025F                1808 ;>      RESIDENT FUNCTION RdHdr_Resident : Status : BYTE { !r0 }
025F                1809 ;>      RESIDENT FUNCTION Rd_Resident : Status : BYTE { !r0 }
025F                1810 ;>      RESIDENT SubFUNCTION Start_StMach
025F                1811 ;>      FUNCTION Sub3( A, B : 3 BYTES { !r0:2, !rC:E } ) : 3 BYTES { !r0:2 }
025F                1812 ;>      FUNCTION Add3( A, B : 3 BYTES { !r0:2, !rC:E } ) : 3 BYTES { !r0:2 }
025F                1813 ;>      PROCEDURE Set_RamBank( Ram_Bank : BYTE { !r0 } )
025F                1814 ;>      PROCEDURE Set_Led( State : BIT { !r0/bit 0 } )
025F                1815 ;>      FUNCTION LoadStatus : BYTE { !r0 }
025F                1816 ;>      PROCEDURE SetStatus( StatusByte : BYTE { !r0 }
025F                1817 ;>                           Value : BYTE { !r1 }
025F                1818 ;>                         )
025F                1819 ;>      PROCEDURE Set_Dmt( Parent1, Parent2 : BYTE { !rB, !r0 } )
025F                1820 ;>      PROCEDURE Clr_Dmt
025F                1821 ;>      FUNCTION FormatBlock( Paraent : BYTE { !r8 } ) :
025F                1822 ;>                          BOOLEAN
025F                1823 ;>                          Status : BYTE { !r0 }
025F                1824 ;>
025F                1825 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
025F                1826                 .LSTOFF
025F                1829                 .LSTON

















        WIDGET.ASSEM            Page  48
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


025F                1830                 .Page
025F                1831 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
025F                1832 ;>
025F                1833 ;>      Procedure: Bsy_Clr
025F                1834 ;>
025F                1835 ;>      Inputs:
025F                1836 ;>              Response     : BYTE { Wrk_Io+$A }
025F                1837 ;>              Cmnd_Pending : BIT { Wrk_Io+$B/Bit 7 }
025F                1838 ;>              IBsy         : BIT { Wrk_Io+$B/Bit 6 }
025F                1839 ;>              MemAdr       : PTR, { !!rC }
025F                1840 ;>
025F                1841 ;>      Outputs: { none }
025F                1842 ;>
025F                1843 ;>      BEGIN
025F                1844 ;>       WHILE CMD DO BEGIN END { busy wait on CMD }
025F                1845 ;>       Set up memory select: Apple <--> Mem
025F                1846 ;>       Memory_Address_Register := MemAdr
025F                1847 ;>       Reset BSY
025F                1848 ;>       WHILE NOT( CMD ) DO BEGIN END { busy wait on CMD- }
025F                1849 ;>       JUMP( Start_Command ) { begin a new command }
025F                1850 ;>      END
025F                1851 ;>
025F                1852 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
025F                1853                 .LSTOFF
025F                1856                 .LSTON


































        WIDGET.ASSEM            Page  49
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


025F                1857                 .Page
025F                1858                 .FIN
025F                1859                 
025F                1860 Clr_Bsy:
025F 31 00        6 1861                 Srp     #Wrk_Io
0261                1862                 
0261 2C A9        6 1863                 Ld      !Port2,#Not_StartL+Disk_Mem+DrwL_Read+Bsy
0263 92 CC       12 1864                 Lde     @!!rC,!rC
0265                1865                 
0265 79 F7        6 1866                 Ld      P3m,!P3m_StMach
0267 52 38        6 1867                 And     !Port3,!Dm_Mask ;set DM/IoPort to Low
0269 69 F8        6 1868                 Ld      P01m,!P01m_StMach
026B 2C A9        6 1869                 Ld      !Port2,#Not_StartL+Disk_Mem+DrwL_Read+Bsy ;toggle AOE
026D 76 EB 20    10 1870                 Tm      !rB,#MultiWr ;check for mutli-write command
0270 6B 04          1871                 Jr      Z,Clr_Bsy_Rd
0272                1872                 
0272 2C 01        6 1873                 Ld      !Port2,#Not_StartL+Apple_Mem
0274 8B 02          1874                 Jr      Clr_Bsy1
0276                1875                 
0276 2C 81        6 1876 Clr_Bsy_Rd:     Ld      !Port2,#Not_StartL+Apple_Mem+DrwL_Read
0278                1877                 
0278 FC 04        6 1878 Clr_Bsy1:       Ld     !rF,#Cmd               ;load mask
027A CC 10        6 1879                 Ld     !rC,#.HIBYTE. Cmnd_Ptr ;MemAdr := Command Buffer
027C DC 1A        6 1880                 Ld     !rD,#.LOWBYTE. Cmnd_Ptr
027E                1881                 
027E                1882 
027E 72 2F        6 1883 Bsy_Lp2:        Tm      !Port2,!rF               ;test for CMD active hi
0280 6B FC          1884                 Jr      Z,Bsy_Lp2
0282                1885                 
0282                1886 ;               \ /   In_Line code, done for SPEED!
0282                1887                 .LSTOFF
0282                1889                 .LSTON



























        WIDGET.ASSEM            Page  50
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0282                1890                 .Page
0282                1891 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0282                1892 ;>
0282                1893 ;>      Procedure: Wait_Cmd
0282                1894 ;>
0282                1895 ;>      Inputs:
0282                1896 ;>             Cmnd_Pending : BOOLEAN, { !rB/bit 7 }
0282                1897 ;>             Response     : BYTE, { !rA }
0282                1898 ;>             IBsy         : BOOLEAN, { !rB/bit 6 }
0282                1899 ;>             MemAdr       : PTR, { !!rC }
0282                1900 ;>
0282                1901 ;>      Outputs: { none }
0282                1902 ;>
0282                1903 ;>      Algorithm:
0282                1904 ;>
0282                1905 ;>      BEGIN
0282                1906 ;>       Set up memory select: Apple <--> Z8
0282                1907 ;>       WHILE NOT( CMD ) DO BEGIN END { busy wait on CMD- }
0282                1908 ;>       Write( Response ) to Apple
0282                1909 ;>       Set BSY
0282                1910 ;>       WHILE CMD DO BEGIN END { busy wait on CMD }
0282                1911 ;>       Read( Apple_Resonse ) from Apple
0282                1912 ;>       IF ( Apple_Response = $55 )
0282                1913 ;>        THEN
0282                1914 ;>         IF NOT( IBsy )
0282                1915 ;>          THEN
0282                1916 ;>            Memory_Address_Register := MemAdr
0282                1917 ;>            Reset BSY
0282                1918 ;>            WHILE NOT( CMD ) DO BEGIN END { busy wait on CMD- }
0282                1919 ;>         Set up memory select: Z8 <--> Mem
0282                1920 ;>         IF Cmnd_Pending
0282                1921 ;>          THEN RETURN
0282                1922 ;>          ELSE JUMP( Start_Command ) { begin a new command }
0282                1923 ;>        ELSE ABORT( Apple_Interface_Exception, Cmnd_Pending,
0282                1924 ;>                    Response, Apple_Response )
0282                1925 ;>      END
0282                1926 ;>
0282                1927 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0282                1928                 .LSTOFF
0282                1931                 .LSTON



















        WIDGET.ASSEM            Page  51
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0282                1932                 .Page
0282                1933                 .FIN
0282                1934                 
0282                1935 Wait_Cmd:
0282 49 F8        6 1936                 Ld      P01m,!P01m_Image ;restore port to load adr
0284 2C A1        6 1937                 Ld      !Port2,#Not_StartL+Disk_Mem+DrwL_Read
0286 92 CC       12 1938                 Lde     @!!rC,!rC ;set external memory address
0288                1939                 
0288 2C B1        6 1940 Wait_Cmd1:      Ld      !Port2,#Not_StartL+Z8_Apple+DrwL_Read
028A                1941                 
028A E6 F8 06    10 1942                 Ld      P01m,#P0_03_Adr+P0_47_Out+Stack_In+P1_Out
028D                1943                 
028D 18 EA        6 1944                 Ld      !Port1,!rA               ;Apple gets Response
028F                1945                 
028F 2C B9        6 1946                 Ld      !Port2,#Not_StartL+Z8_Apple+DrwL_Read+Bsy
0291                1947                 
0291 FC 04        6 1948                 Ld      !rF,#Cmd
0293 EC 55        6 1949                 Ld      !rE,#Apl_Ack    ;get ready for response
0295 DC 40        6 1950                 Ld      !rD,#IBsy
0297                1951 
0297 72 2F        6 1952 Cmd_Lp2:        Tm      !Port2,!rF               ;test for CMD inactive low
0299 EB FC          1953                 Jr      Nz,Cmd_Lp2
029B                1954                 
029B                1955 ;Make Port1 an input
029B E6 F8 0E    10 1956                 Ld      P01m,#P0_03_Adr+P0_47_Out+Stack_In+P1_In
029E 2C A9        6 1957                 Ld      !Port2,#Not_StartL+Disk_Mem+DrwL_Read+Bsy ;strobe AOE
02A0 2C B9        6 1958                 Ld      !Port2,#Not_StartL+Z8_Apple+DrwL_Read+Bsy ;strobe AOE
02A2                1959                 
02A2 A2 1E        6 1960                 Cp      !Port1,!rE
02A4 EB 26          1961                 Jr      Nz,Cmd_NotAck
02A6                1962                 
02A6 72 BD        6 1963 Cmd_TstBsy:     Tm      !rB,!rD                 ;test IBsy
02A8 6B 09          1964                 Jr      Z,No_IBsy
02AA                1965                 
02AA                1966 ;get back to System access
02AA 49 F8        6 1967 Cmd_Leave:      Ld      P01m,!P01m_Image
02AC 2C 99        6 1968                 Ld      !Port2,#Not_StartL+Bsy+Z8_Mem+DrwL_Read
02AE 59 F7        6 1969                 Ld      P3m,!P3m_Image
02B0 31 10        6 1970                 Srp     #Wrk_Sys
02B2 AF          14 1971                 Ret                             ;resume command
02B3                1972                 
02B3                1973                 
02B3                1974 ;MEM <--> Host(wr)
02B3                1975 
02B3                1976 ;change DM to output
02B3 79 F7        6 1977 No_IBsy:        Ld      P3m,!P3m_StMach
02B5 52 38        6 1978                 And     !Port3,!Dm_Mask ;set DM/IoPort low
02B7                1979                 
02B7 2C 01        6 1980                 Ld      !Port2,#Not_StartL+Apple_Mem
02B9                1981                 
02B9 FC 04        6 1982                 Ld      !rF,#Cmd
02BB 72 2F        6 1983 Cmd_Lp3:        Tm      !Port2,!rF               ;test for CMD active hi
02BD 6B FC          1984                 Jr      Z,Cmd_Lp3
02BF                1985                 





        WIDGET.ASSEM            Page  52
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


02BF 49 F8        6 1986                 Ld      P01m,!P01m_Image
02C1 2C 91        6 1987                 Ld      !Port2,#Not_StartL+Z8_Mem+DrwL_Read
02C3 59 F7        6 1988                 Ld      P3m,!P3m_Image
02C5 76 EB 80    10 1989                 Tm      !rB,#Cmnd_Pending
02C8 6D 10 0A       1990                 Jp      Z,Start_Vector
02CB AF          14 1991                 Ret
02CC                1992                 
02CC                1993                 
02CC F8 E1        6 1994 Cmd_NotAck:     Ld     !rF,!Port1
02CE 49 F8        6 1995                 Ld     P01m,!P01m_Image
02D0 59 F7        6 1996                 Ld     P3m,!P3m_Image
02D2 2C 99        6 1997                 Ld     !Port2,#Not_StartL+Bsy+Z8_Mem+DrwL_Read
02D4 31 10        6 1998                 Srp    #Wrk_Sys
02D6                1999                 
02D6 A6 0F 69    10 2000                 Cp     Wrk_Io+$F,#Free_Proc ;check for Freeing up the bus
02D9 6D 10 21       2001                 Jp     Z,Free_Vector
02DC                2002                 
02DC 70 0F          2003 Wt_Cmd_Nak:     Push   Wrk_Io+$F
02DE D6 1E 89    20 2004                 Call   ClrNormStat
02E1 B0 E0        6 2005                  Clr    !r0 ;byte 0
02E3 1C 80        6 2006                  Ld     !r1,#Bad_55
02E5 D6 04 03    20 2007                 Call    SetStatus
02E8 50 E9       10 2008                  Pop    !r9
02EA D6 05 1F    20 2009                 Call    Abort
02ED                2010                 
02ED                2011                 .LSTOFF
02ED                2013                 .LSTON
































        WIDGET.ASSEM            Page  53
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


02ED                2014                 .Page
02ED                2015 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
02ED                2016 ;>
02ED                2017 ;>              RESIDENT ROUTINE  { source code is in Resident.Assem }
02ED                2018 ;>
02ED                2019 ;>      Procedure: Get_Wr_Data  { Get Write Data from Host }
02ED                2020 ;>
02ED                2021 ;>      Inputs:
02ED                2022 ;>             Response     : BYTE, { Wrk_Io+$A }
02ED                2023 ;>
02ED                2024 ;>
02ED                2025 ;>      BEGIN
02ED                2026 ;>       Wait_Cmd( Command_Pending, Response, NotIBsy, WBuffer1 )
02ED                2027 ;>       Wait_Cmd( Command_Pending, EndWriteResponse, IBsy, WBuffer1 )
02ED                2028 ;>      END
02ED                2029 ;>
02ED                2030 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
02ED                2031                 .LSTOFF
02ED                2034                 .LSTON








































        WIDGET.ASSEM            Page  54
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


02ED                2035                 .Page
02ED                2036                 .FIN
02ED                2037 
02ED                2038 Get_Wr_Data:
02ED 31 00        6 2039                 Srp     #Wrk_Io
02EF                2040                 
02EF BC 80        6 2041                  Ld     !rB,#Cmnd_Pending ;Cmnd_Pending := True, IBsy := False
02F1 CC 10        6 2042                  Ld     !rC,#.HIBYTE. WBuffer1
02F3 DC 21        6 2043                  Ld     !rD,#.LOWBYTE. WBuffer1
02F5 D6 02 82    20 2044                 Call    Wait_Cmd
02F8                2045                 
02F8 AC 06        6 2046                  Ld     !rA,#End_Wr_Response
02FA BC C0        6 2047                  Ld     !rB,#Cmnd_Pending+IBsy ;Cmnd_Pending := True
02FC D6 02 82    20 2048                 Call    Wait_Cmd
02FF                2049                 
02FF 31 10        6 2050                 Srp     #Wrk_Sys
0301 AF          14 2051                 Ret
0302                2052                 
0302                2053                 .LSTOFF
0302                2055                 .LSTON







































        WIDGET.ASSEM            Page  55
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0302                2056                 .Page
0302                2057 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0302                2058 ;>
0302                2059 ;>              RESIDENT ROUTINE  { source code is in Resident.Assem }
0302                2060 ;>
0302                2061 ;>      Procedure: Ack_Read     { Acknowledge read command, set BSY }
0302                2062 ;>
0302                2063 ;>      Inputs:
0302                2064 ;>              Response : BYTE { Wrk_Io+$A }
0302                2065 ;>
0302                2066 ;>      Outputs: { none }
0302                2067 ;>
0302                2068 ;>      BEGIN
0302                2069 ;>       Wait_Cmd( Command_Pending, Response, Bsy, x )
0302                2070 ;>      END
0302                2071 ;>
0302                2072 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0302                2073                 .LSTOFF
0302                2076                 .LSTON








































        WIDGET.ASSEM            Page  56
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0302                2077                 .Page
0302                2078                 .FIN
0302                2079 
0302                2080 Ack_Read:
0302 31 00        6 2081                 Srp     #Wrk_Io
0304                2082                  
0304 BC C0        6 2083                  Ld     !rB,#Cmnd_Pending+IBsy
0306 D6 02 88    20 2084                 Call    Wait_Cmd1
0309                2085                 
0309 31 10        6 2086                 Srp     #Wrk_Sys
030B AF          14 2087                 Ret
030C                2088                 
030C                2089                 .LSTOFF
030C                2091                 .LSTON













































        WIDGET.ASSEM            Page  57
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


030C                2092                 .Page
030C                2093 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
030C                2094 ;>
030C                2095 ;>      Function: Wr_Resident  { Write Resident }
030C                2096 ;>
030C                2097 ;>      This function exists primarily because the architecture of the
030C                2098 ;>      Widget Controller prevents the Z8 from executing instructions
030C                2099 ;>      from external program memory while thr state machine is running.
030C                2100 ;>
030C                2101 ;>      Inputs: { none }
030C                2102 ;>
030C                2103 ;>      Outputs:
030C                2104 ;>              Status: BYTE { !r0 }
030C                2105 ;>
030C                2106 ;>      Algorithm:
030C                2107 ;>
030C                2108 ;>      BEGIN
030C                2109 ;>       Msel0:1 := Disk <--> Mem
030C                2110 ;>       Set-up external ram address counter for WRITE
030C                2111 ;>       DiskRW := Write
030C                2112 ;>       RdHdrH := False
030C                2113 ;>       IF ( Cylinder > RWI_Cylinder )
030C                2114 ;>        THEN
030C                2115 ;>              PC := True
030C                2116 ;>              RWI := True
030C                2117 ;>        ELSE
030C                2118 ;>              PC := False
030C                2119 ;>              RWI := False
030C                2120 ;>       StartStateMachine
030C                2121 ;>      END
030C                2122 ;>
030C                2123 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
030C                2124                 .LSTOFF
030C                2127                 .LSTON

























        WIDGET.ASSEM            Page  58
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


030C                2128                 .Page
030C                2129                 .FIN
030C                2130 
030C                2131 
030C 31 00        6 2132 Wr_Resident:    Srp     #Wrk_Io
030E                2133                 
030E 2C 29        6 2134                 Ld      !Port2,#Not_StartL+Bsy+Disk_Mem
0310                2135                 
0310 E8 20        6 2136                  Ld     !rE,Hi_Rwi_Reg
0312 F8 21        6 2137                  Ld     !rF,Lo_Rwi_Reg
0314 24 53 EF    10 2138                  Sub    !rF,Cylinder+1 ;check for  ( > RWI_Cylinder )
0317 34 52 EE    10 2139                  Sbc    !rE,Cylinder
031A 1B 04          2140                 Jr      Lt,WPC_Else
031C                2141                 
031C AC 7F        6 2142                 Ld      !rA,#$7F ;bits inactive
031E 8B 02          2143                 Jr      WPC_End
0320                2144                 
0320 AC 73        6 2145 WPC_Else:       Ld      !rA,#$7F-RWI-PC
0322                2146                 
0322 8B 28          2147 WPC_End:        Jr      Rd_Res2
0324                2148                 
0324                2149                 .LSTOFF
0324                2151                 .LSTON




































        WIDGET.ASSEM            Page  59
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0324                2152                 .Page
0324                2153 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0324                2154 ;>
0324                2155 ;>      Function: Fmt_Resident  { Format Resident }
0324                2156 ;>
0324                2157 ;>      This function exists primarily because the architecture of the
0324                2158 ;>      Widget Controller prevents the Z8 from executing instructions
0324                2159 ;>      from external program memory while thr state machine is running.
0324                2160 ;>
0324                2161 ;>      Inputs: { none }
0324                2162 ;>
0324                2163 ;>      Outputs:
0324                2164 ;>              Status: BYTE { !r0 }
0324                2165 ;>
0324                2166 ;>      Algorithm:
0324                2167 ;>
0324                2168 ;>      BEGIN
0324                2169 ;>       Msel0:1 := Disk <--> Mem
0324                2170 ;>       Set-up external ram address counter for FORMAT
0324                2171 ;>       DiskRW := Write
0324                2172 ;>       RdHdrH := True
0324                2173 ;>       IF ( Cylinder > RWI_Cylinder )
0324                2174 ;>        THEN
0324                2175 ;>              PC := True
0324                2176 ;>              RWI := True
0324                2177 ;>        ELSE
0324                2178 ;>              PC := False
0324                2179 ;>              RWI := False
0324                2180 ;>       StartStateMachine
0324                2181 ;>      END
0324                2182 ;>
0324                2183 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0324                2184                 .LSTOFF
0324                2187                 .LSTON

























        WIDGET.ASSEM            Page  60
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0324                2188                 .Page
0324                2189                 .FIN
0324                2190 
0324                2191 
0324 31 00        6 2192 Fmt_Resident:   Srp     #Wrk_Io
0326                2193                 
0326 2C 29        6 2194                 Ld      !Port2,#Not_StartL+Bsy+Disk_Mem
0328                2195                 
0328 E8 20        6 2196                  Ld     !rE,Hi_Rwi_Reg
032A F8 21        6 2197                  Ld     !rF,Lo_Rwi_Reg
032C 24 53 EF    10 2198                  Sub    !rF,Cylinder+1 ;check for  ( > RWI_Cylinder )
032F 34 52 EE    10 2199                  Sbc    !rE,Cylinder
0332 1B 04          2200                 Jr      Lt,FPC_Else
0334                2201                 
0334 AC FF        6 2202                 Ld      !rA,#$FF ;bits inactive
0336 8B 02          2203                 Jr      FPC_End
0338                2204                 
0338 AC F3        6 2205 FPC_Else:       Ld      !rA,#$FF-RWI-PC
033A                2206                 
033A EC 10        6 2207 FPC_End:        Ld      !rE,#.HIBYTE. FormatArray
033C FC 20        6 2208                 Ld      !rF,#.LOWBYTE. FormatArray
033E                2209                 
033E 8B 10          2210                 Jr      Start_StMach
0340                2211                 
0340                2212                 .LSTOFF
0340                2214                 .LSTON

































        WIDGET.ASSEM            Page  61
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0340                2215                 .Page
0340                2216 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0340                2217 ;>
0340                2218 ;>      Function: RdHdr_Resident  { Read Header Resident }
0340                2219 ;>
0340                2220 ;>      This function exists primarily because the architecture of the
0340                2221 ;>      Widget Controller prevents the Z8 from executing instructions
0340                2222 ;>      from external program memory while thr state machine is running.
0340                2223 ;>
0340                2224 ;>      Inputs: { none }
0340                2225 ;>
0340                2226 ;>      Outputs:
0340                2227 ;>              Status: BYTE { !r0 }
0340                2228 ;>
0340                2229 ;>      Algorithm:
0340                2230 ;>
0340                2231 ;>      BEGIN
0340                2232 ;>       Msel0:1 := Disk <--> Mem
0340                2233 ;>       Set-up external ram address counter for READ
0340                2234 ;>       DiskRW := Read
0340                2235 ;>       RdHdrH := True
0340                2236 ;>       RWI := False
0340                2237 ;>       PC := False
0340                2238 ;>       StartStateMachine
0340                2239 ;>      END
0340                2240 ;>
0340                2241 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0340                2242                 .LSTOFF
0340                2245                 .LSTON






























        WIDGET.ASSEM            Page  62
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0340                2246                 .Page
0340                2247                 .FIN
0340                2248 
0340                2249 RdHdr_Resident: 
0340 31 00        6 2250                 Srp     #Wrk_Io
0342                2251                 
0342 AC FF        6 2252                 Ld      !rA,#$FF ;bits inactive
0344                2253                 
0344 8B 04          2254                 Jr      Rd_Res1
0346                2255                 
0346                2256                 .LSTOFF
0346                2258                 .LSTON















































        WIDGET.ASSEM            Page  63
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0346                2259                 .Page
0346                2260 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0346                2261 ;>
0346                2262 ;>      Function: Rd_Resident  { Read Resident }
0346                2263 ;>
0346                2264 ;>      This function exists primarily because the architecture of the
0346                2265 ;>      Widget Controller prevents the Z8 from executing instructions
0346                2266 ;>      from external program memory while thr state machine is running.
0346                2267 ;>
0346                2268 ;>      Inputs: { none }
0346                2269 ;>
0346                2270 ;>      Outputs:
0346                2271 ;>              Status: BYTE { !r0 }
0346                2272 ;>
0346                2273 ;>      Algorithm:
0346                2274 ;>
0346                2275 ;>      BEGIN
0346                2276 ;>       Msel0:1 := Disk <--> Mem
0346                2277 ;>       Set-up external ram address counter for READ
0346                2278 ;>       DiskRW := Read
0346                2279 ;>       RdHdrH := False
0346                2280 ;>       PC := False
0346                2281 ;>       RWI := False
0346                2282 ;>       StartStateMachine
0346                2283 ;>      END
0346                2284 ;>
0346                2285 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0346                2286                 .LSTOFF
0346                2289                 .LSTON






























        WIDGET.ASSEM            Page  64
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0346                2290                 .Page
0346                2291                 .FIN
0346                2292 
0346                2293 
0346                2294 Rd_Resident:    
0346 31 00        6 2295                 Srp     #Wrk_Io
0348 AC 7F        6 2296                 Ld      !rA,#$7F ;bits inactive
034A                2297                 
034A 2C A9        6 2298 Rd_Res1:        Ld      !Port2,#Not_StartL+Bsy+Disk_Mem+DrwL_Read
034C                2299                 
034C EC 10        6 2300 Rd_Res2:        Ld      !rE,#.HIBYTE. ReadArray
034E FC 00        6 2301                 Ld      !rF,#.LOWBYTE. ReadArray
0350                2302                 
0350                2303 ;               \ /  ;In-Line code for Speed!!
0350                2304                 .LSTOFF
0350                2306                 .LSTON











































        WIDGET.ASSEM            Page  65
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0350                2307                 .Page
0350                2308 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0350                2309 ;>
0350                2310 ;>      SubFunction: Start_StMach  { StartStateMachine }
0350                2311 ;>
0350                2312 ;>      This is a routine that is shared by all the resident state machine
0350                2313 ;>      routines and exists primarily for the purpose of saving space. It's
0350                2314 ;>      function is to complete the set-up for the state machine and then 
0350                2315 ;>      start it up and wait for it to finish.
0350                2316 ;>
0350                2317 ;>      BEGIN
0350                2318 ;>       Z8 Port 3, Bit 4 := 0  { instead of DM it is an I/O port }
0350                2319 ;>       Z8 Port 1 := Input  { keep Z8 from conflicting with Disk data }
0350                2320 ;>       SectorsRead := 2 * NumberOfSectors
0350                2321 ;>       WHILE SectorMark DO BEGIN END
0350                2322 ;>       StartL := True
0350                2323 ;>       WHILE NOT( SectorDnL ) AND ( SectorsRead <> 0 ) DO
0350                2324 ;>              BEGIN
0350                2325 ;>                      IF SectorMark
0350                2326 ;>                        THEN
0350                2327 ;>                              SectorsRead := SectorsRead - 1
0350                2328 ;>                              WHILE SectorMark DO BEGIN END
0350                2329 ;>              END       
0350                2330 ;>       Z8 Port 3, Bit 4 := DM
0350                2331 ;>       Z8 Port 1 := Address/Data
0350                2332 ;>       Msel0:1 := Z8 <--> Mem
0350                2333 ;>       Status := Status_Port
0350                2334 ;>       IF EccErr
0350                2335 ;>        THEN Status.CrcError := True
0350                2336 ;>       StartL := False
0350                2337 ;>      END
0350                2338 ;>
0350                2339 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0350                2340                 .LSTOFF
0350                2343                 .LSTON
























        WIDGET.ASSEM            Page  66
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0350                2344                 .Page
0350                2345                 .FIN
0350                2346                 
0350                2347 Start_StMach:
0350 92 EE       12 2348                 Lde     @!!rE,!rE       ;set buffer address
0352                2349                 
0352 79 F7        6 2350                 Ld      P3m,!P3m_StMach
0354 52 38        6 2351                 And     !Port3,!Dm_Mask  ;set DM/IoPort Low
0356                2352                 
0356 69 F8        6 2353                 Ld      P01m,!P01m_StMach
0358 08 EA        6 2354                 Ld      !Port0,!rA
035A                2355                 
035A 76 E3 02    10 2356 St_Res_1:       Tm      !Port3,#SectorMark  ;test for sector mark
035D EB FB          2357                 Jr      Nz,St_Res_1
035F                2358                 
035F 52 29        6 2359                 And     !Port2,!Start_Mask        ;start state machine
0361                2360                 
0361 AC 01        6 2361                 Ld      !rA,#Not_StartL
0363 BC 02        6 2362                 Ld      !rB,#Not_EccErr
0365 EC 08        6 2363                 Ld      !rE,#SectDnL    ;load mask
0367 FC 02        6 2364                 Ld      !rF,#SectorMark
0369 E6 1A 15    10 2365                 Ld      Wrk_Sys+$A,#( NbrSctrs+2 ) ;timeout after 21 sectors
036C D6 04 13    20 2366                 Call    Set_Dmt
036F                2367                 
036F 72 3F        6 2368 St_Res_2:       Tm      !Port3,!rF               ;count sector marks
0371 6B 08          2369                 Jr      Z,St_Res_3
0373 00 1A        6 2370                 Dec     Wrk_Sys+$A
0375 6B 0C          2371                 Jr      Z,St_Res_4
0377                2372                 
0377 72 3F        6 2373 St_Res_25:      Tm      !Port3,!rF        
0379 EB FC          2374                 Jr      Nz,St_Res_2_5   ;wait for mark to go away
037B                2375                 
037B 62 3E        6 2376 St_Res_3:       Tcm     !Port3,!rE  ;wait for state machine to finish
037D 6B F0          2377                 Jr      Z,St_Res_2
037F 62 3E        6 2378                 Tcm     !Port3,!rE  ;sample it twice
0381 6B EC          2379                 Jr      Z,St_Res_2
0383                2380                 
0383 49 F8        6 2381 St_Res_4:       Ld      P01m,!P01m_Image
0385 2C 98        6 2382                 Ld      !Port2,#Bsy+Z8_Mem+DrwL_Read
0387 59 F7        6 2383                 Ld      P3m,!P3m_Image
0389                2384                 
0389 CC 1F        6 2385                 Ld      !rC,#.HIBYTE. StatusPort
038B DC 00        6 2386                 Ld      !rD,#.LOWBYTE. StatusPort
038D 82 FC       12 2387                 Lde     !rF,@!!rC
038F                2388                 
038F 72 2B        6 2389                 Tm      !Port2,!rB
0391 6B 08          2390                 Jr      Z,Res_EccErr
0393                2391                 
0393 42 2A        6 2392 Res_StMach:     Or      !Port2,!rA       ;reset state machine
0395 8F           6 2393                 Di                       ;clear the dead man timer
0396                2394                 
0396 31 10        6 2395                 Srp     #Wrk_Sys
0398 08 0F        6 2396                 Ld      !r0,Wrk_Io+$F ;return StMach status
039A AF          14 2397                 Ret





        WIDGET.ASSEM            Page  67
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


039B                2398                 
039B                2399                 
039B 76 56 20    10 2400 Res_EccErr:     Tm      DiskStat,#Wr_Op
039E EB F3          2401                 Jr      Nz,Res_StMach
03A0 56 EF BF    10 2402                 And     !rF,#$FF-WrtNvldL ;if ECC error
03A3 8B EE          2403                 Jr      Res_StMach
03A5                2404                 
03A5                2405                 .LSTOFF
03A5                2407                 .LSTON


















































        WIDGET.ASSEM            Page  68
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03A5                2408                 .Page
03A5                2409 ;>>>>>>>>>>>>>>>>>>>>>>>>>
03A5                2410 ;>
03A5                2411 ;>      Function: Sub3, Add3
03A5                2412 ;>
03A5                2413 ;>              { RESIDENT ROUTINES!! }
03A5                2414 ;>
03A5                2415 ;>      These functions perform the following 24 bit arithmetic operations:
03A5                2416 ;>
03A5                2417 ;>        Sub3: A <-- A - B
03A5                2418 ;>        Add3: A <-- A + B
03A5                2419 ;>
03A5                2420 ;>      Inputs:
03A5                2421 ;>              A: 3 BYTES { !r0, !r1, !r2 }
03A5                2422 ;>              B: 3 BYTES { !rC, !rD, !rE }
03A5                2423 ;>
03A5                2424 ;>      Outputs:
03A5                2425 ;>              A: 3 BYTES { !r0, !r1, !r2 }
03A5                2426 ;>
03A5                2427 ;>>>>>>>>>>>>>>>>>>>>>>>>>
03A5                2428                 .LSTOFF
03A5                2431                 .LSTON





































        WIDGET.ASSEM            Page  69
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03A5                2432                 .Page
03A5                2433                 .FIN
03A5                2434                 
03A5                2435 Sub3:
03A5 22 2E        6 2436                 Sub     !r2,!rE
03A7 32 1D        6 2437                 Sbc     !r1,!rD
03A9 32 0C        6 2438                 Sbc     !r0,!rC
03AB AF          14 2439                 Ret
03AC                2440 
03AC                2441 Add3:
03AC 02 2E        6 2442                 Add     !r2,!rE
03AE 12 1D        6 2443                 Adc     !r1,!rD
03B0 12 0C        6 2444                 Adc     !r0,!rC
03B2                2445                 
03B2 AF          14 2446                 Ret
03B3                2447                 
03B3                2448                 .LSTOFF
03B3                2450                 .LSTON









































        WIDGET.ASSEM            Page  70
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03B3                2451                 .Page
03B3                2452 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
03B3                2453 ;>
03B3                2454 ;>      Procedure: Set_RamBank
03B3                2455 ;>
03B3                2456 ;>      This procedure activates the 2k bank of ram that is indicated by
03B3                2457 ;>      the input parameter.
03B3                2458 ;>
03B3                2459 ;>      Inputs:
03B3                2460 ;>              Ram_Bank : BYTE { !r0 }
03B3                2461 ;>
03B3                2462 ;>      Outputs: { none }
03B3                2463 ;>
03B3                2464 ;>      Algorithm:
03B3                2465 ;>
03B3                2466 ;>      BEGIN
03B3                2467 ;>       IF ( Ram_Bank > 3 ) THEN Abort
03B3                2468 ;>       deselect all ram bits
03B3                2469 ;>       select the ram bit pointed to by Ram_Bank
03B3                2470 ;>      END
03B3                2471 ;>
03B3                2472 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
03B3                2473                 .LSTOFF
03B3                2476                 .LSTON



































        WIDGET.ASSEM            Page  71
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03B3                2477                 .Page
03B3                2478                 .FIN
03B3                2479 
03B3 A6 E0 04    10 2480 Set_RamBank:    Cp      !r0,#4
03B6 1B 03          2481                 Jr      Lt,Set_RB_Start
03B8                2482                 
03B8 D6 05 1F    20 2483                 Call    Abort
03BB                2484                 
03BB 2C 03        6 2485 Set_RB_Start:   Ld      !r2,#.HIBYTE. Ram_Table
03BD 3C D8        6 2486                 Ld      !r3,#.LOWBYTE. Ram_Table
03BF 90 E0        6 2487                 Rl      !r0 ;multiply index by 2
03C1 02 30        6 2488                 Add     !r3,!r0 ;index into table
03C3 16 E2 00    10 2489                 Adc     !r2,#0
03C6 C2 12       12 2490                 Ldc     !r1,@!!r2
03C8 A0 E2       10 2491                 Incw    !!r2
03CA C2 02       12 2492                 Ldc     !r0,@!!r2
03CC                2493                 
03CC 2C 19        6 2494                 Ld      !r2,#.HIBYTE. RamBank0 ;set the adr bits
03CE 38 E0        6 2495                 Ld      !r3,!r0
03D0 92 32       12 2496                 Lde     @!!r2,!r3
03D2 2E           6 2497                 Inc     !r2
03D3 38 E1        6 2498                 Ld      !r3,!r1
03D5 92 32       12 2499                 Lde     @!!r2,!r3
03D7 AF          14 2500                 Ret
03D8                2501                 
03D8 00 00          2502 Ram_Table:      .DB     0,0 ;adr 13 := 0, adr 12 := 0 
03DA 00 01          2503                 .DB     0,1 ;adr 13 := 0, adr 12 := 1
03DC 01 00          2504                 .DB     1,0 ;adr 13 := 1, adr 12 := 0 
03DE 01 01          2505                 .DB     1,1 ;adr 13 := 1, adr 12 := 1
03E0                2506                 
03E0                2507                 .LSTOFF
03E0                2509                 .LSTON



























        WIDGET.ASSEM            Page  72
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03E0                2510                 .Page
03E0                2511 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
03E0                2512 ;>
03E0                2513 ;>      Procedure: Set_Led
03E0                2514 ;>
03E0                2515 ;>      This procedure changes the state of the controller LED. The
03E0                2516 ;>      state is determined by the value of State ( if State is Odd
03E0                2517 ;>      then the Led is lit, otherwise it is turned off ).
03E0                2518 ;>
03E0                2519 ;>      Inputs:
03E0                2520 ;>              State : BIT { !r0/bit 0 }
03E0                2521 ;>
03E0                2522 ;>      Outputs: { none }
03E0                2523 ;>
03E0                2524 ;>      Algorithm:
03E0                2525 ;>
03E0                2526 ;>      BEGIN
03E0                2527 ;>       Led[ State ] := State
03E0                2528 ;>       Bank_Image.Led := State
03E0                2529 ;>      END
03E0                2530 ;>
03E0                2531 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
03E0                2532                 .LSTOFF
03E0                2535                 .LSTON



































        WIDGET.ASSEM            Page  73
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03E0                2536                 .Page
03E0                2537                 .FIN
03E0                2538 
03E0                2539 Set_Led:
03E0 56 24 FE    10 2540                 And     Excpt_Stat,#$FF-Led_Stat
03E3 44 E0 24    10 2541                 Or      Excpt_Stat,!r0
03E6 2C 18        6 2542                 Ld     !r2,#.HIBYTE. Led
03E8 38 E0        6 2543                 Ld     !r3,!r0
03EA 92 32       12 2544                 Lde    @!!r2,!r3
03EC                2545                 
03EC AF          14 2546                 Ret
03ED                2547                 
03ED 08 24        6 2548 Invert_Led:      Ld     !r0,Excpt_Stat
03EF B6 E0 01    10 2549                  Xor    !r0,#$FF-Led_Mask ;invert only the Led bit
03F2 8B EC          2550                 Jr     Set_Led
03F4                2551                  
03F4 2C 00        6 2552 Led_Wait:        Ld     !r2,#.HIBYTE. 50 ;wait a second
03F6 3C 32        6 2553                  Ld     !r3,#.LOWBYTE. 50
03F8 D6 01 CB    20 2554                 Call    MsWait
03FB AF          14 2555                 Ret
03FC                2556                 
03FC                2557                 .LSTOFF
03FC                2559                 .LSTON




































        WIDGET.ASSEM            Page  74
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03FC                2560                 .Page
03FC                2561 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
03FC                2562 ;>
03FC                2563 ;>      Function: LoadStatus
03FC                2564 ;>
03FC                2565 ;>      This function returns the current value of the
03FC                2566 ;>      controller status port.
03FC                2567 ;>
03FC                2568 ;>      Inputs: { none }
03FC                2569 ;>
03FC                2570 ;>      Outputs:
03FC                2571 ;>              LoadStatus : BYTE { !r0 }
03FC                2572 ;>
03FC                2573 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
03FC                2574                 .LSTOFF
03FC                2577                 .LSTON











































        WIDGET.ASSEM            Page  75
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


03FC                2578                 .Page
03FC                2579                 .FIN
03FC                2580 
03FC                2581 LoadStatus:
03FC 2C 1F        6 2582                 Ld      !r2,#.HIBYTE. Status_Port
03FE 3C 00        6 2583                 Ld      !r3,#.LOWBYTE. Status_Port
0400 82 02       12 2584                 Lde     !r0,@!!r2
0402                2585                 
0402 AF          14 2586                 Ret
0403                2587                 
0403                2588                 .LSTOFF
0403                2590                 .LSTON















































        WIDGET.ASSEM            Page  76
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0403                2591                 .Page
0403                2592 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0403                2593 ;>
0403                2594 ;>      Procedure: SetStatus
0403                2595 ;>
0403                2596 ;>      This procedure is used to set a particular bit or bits
0403                2597 ;>      within a specific byte of standard status.
0403                2598 ;>
0403                2599 ;>      Inputs:
0403                2600 ;>              StatusByte : BYTE { !r0 }
0403                2601 ;>              Value      : BYTE { !r1 }
0403                2602 ;>
0403                2603 ;>      Outputs: { none }
0403                2604 ;>
0403                2605 ;>      Algorithm:
0403                2606 ;>
0403                2607 ;>      BEGIN
0403                2608 ;>       StandardStatus[ StatusByte ] := StandardStatus[ StatusByte ] OR
0403                2609 ;>                                              Value
0403                2610 ;>      END
0403                2611 ;>
0403                2612 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0403                2613                 .LSTOFF
0403                2616                 .LSTON



































        WIDGET.ASSEM            Page  77
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0403                2617                 .Page
0403                2618                 .FIN
0403                2619 
0403                2620 SetStatus:
0403 2C 14        6 2621                 Ld      !r2,#.HIBYTE. CStatus0
0405 3C 95        6 2622                 Ld      !r3,#.LOWBYTE. CStatus0
0407 02 30        6 2623                 Add     !r3,!r0
0409 16 E2 00    10 2624                 Adc     !r2,#0
040C 82 02       12 2625                 Lde     !r0,@!!r2
040E 42 01        6 2626                 Or      !r0,!r1
0410 92 02       12 2627                 Lde     @!!r2,!r0
0412 AF          14 2628                 Ret
0413                2629                 
0413                2630                 .LSTOFF
0413                2632                 .LSTON












































        WIDGET.ASSEM            Page  78
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0413                2633                 .Page
0413                2634 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0413                2635 ;>
0413                2636 ;>      Procedure: Set_Dmt  { SetDeadManTimer }
0413                2637 ;>
0413                2638 ;>      This procedure sets the DeadManTimer bit, thus enabling the
0413                2639 ;>      decrementing of the DeadManCounter every time a timer interrupt
0413                2640 ;>      occurs. The Set_Dmt routine also initializes the DeadManCounter
0413                2641 ;>      as well as storing away information concerning the process(s)
0413                2642 ;>      that started the Dmt.
0413                2643 ;>
0413                2644 ;>      Inputs: { none }
0413                2645 ;>
0413                2646 ;>      Outputs: { none }
0413                2647 ;>
0413                2648 ;>      Algorithm :
0413                2649 ;>
0413                2650 ;>       BEGIN
0413                2651 ;>        Disable Interrupts { entering critical section }
0413                2652 ;>        Dmt_Par1 := Parent1
0413                2653 ;>        Dmt_Par2 := Parent2
0413                2654 ;>        DeadManCounter := 0 { assume timer interrupts every 10 msecs }
0413                2655 ;>        Enable Interrupts { leaving critical section }
0413                2656 ;>       END
0413                2657 ;>
0413                2658 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0413                2659                 .LSTOFF
0413                2662                 .LSTON































        WIDGET.ASSEM            Page  79
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0413                2663                 .Page
0413                2664                 .FIN
0413                2665                 
0413                2666 Set_Dmt:
0413 8F           6 2667                 Di                              ;enter critical section
0414                2668                 
0414 E6 36 01    10 2669                 Ld      Dmt_Counter,#.HIBYTE. Dmt_Val
0417 E6 37 F4    10 2670                 Ld      Dmt_Counter+1,#.LOWBYTE. Dmt_Val
041A                2671                 
041A 56 FA DF    10 2672                 And     Irq,#$FF-Timer1 ;clear old events
041D 9F           6 2673                 Ei
041E AF          14 2674                 Ret
041F                2675                 
041F                2676                 .LSTOFF
041F                2678                 .LSTON












































        WIDGET.ASSEM            Page  80
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


041F                2679                 .Page
041F                2680 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
041F                2681 ;>
041F                2682 ;>      Procedure: Clr_Dmt  { ClearDeadManTimer }
041F                2683 ;>
041F                2684 ;>      This procedure clears the DeadManTimer bit, thus disabling the
041F                2685 ;>      decrementing of the DeadManTimerCounter. This routine also
041F                2686 ;>      enables the NormalTimer.
041F                2687 ;>
041F                2688 ;>      Inputs : none
041F                2689 ;>
041F                2690 ;>      Outputs : none
041F                2691 ;>
041F                2692 ;>      Algorithm :
041F                2693 ;>
041F                2694 ;>       BEGIN
041F                2695 ;>        Disable Interrupts { entering critical section }
041F                2696 ;>       END
041F                2697 ;>
041F                2698 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
041F                2699                 .LSTOFF
041F                2702                 .LSTON





































        WIDGET.ASSEM            Page  81
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


041F                2703                 .Page
041F                2704                 .FIN
041F                2705                 
041F                2706 Clr_Dmt:
041F 8F           6 2707                 Di                              ;enter critical section
0420 AF          14 2708                 Ret
0421                2709                 
0421                2710                 .LSTOFF
0421                2712                 .LSTON


















































        WIDGET.ASSEM            Page  82
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0421                2713                 .Page
0421                2714 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0421                2715 ;>
0421                2716 ;>      Procedure Fragment: Chk_Park1
0421                2717 ;>
0421                2718 ;>      This part of Strt_FreeProcess was moved to resident program
0421                2719 ;>      space mainly for debugging purposes. I wanted a place in the
0421                2720 ;>      code where the DM could be halted AFTER the host had released
0421                2721 ;>      the controller as a process.
0421                2722 ;>
0421                2723 ;>      Inputs:
0421                2724 ;>              Wait_Interval : WORD { !!r2 }
0421                2725 ;>
0421                2726 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0421                2727                 .LSTOFF
0421                2730                 .LSTON











































        WIDGET.ASSEM            Page  83
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0421                2731                 .Page
0421                2732                 .FIN
0421                2733 
0421 56 02 F7    10 2734 Chk_Park1:      And     Port2,#$FF-Bsy ;allow the host to set CMD
0424                2735                 
0424 56 FA DF    10 2736 Chk_Pk3:        And     Irq,#$FF-Timer1 ;clear any old interrupts
0427                2737 
0427 76 02 04    10 2738 Chk_Park2:      Tm      Port2,#Cmd ;check for host wanting our attention
042A EB 0A          2739                 Jr      Nz,FreeP_Leave
042C 76 FA 20    10 2740                 Tm      Irq,#Timer1 ;check for 10ms interrupt
042F 6B F6          2741                 Jr      Z,Chk_Park2
0431                2742                 
0431 80 E2       10 2743                 Decw    !!r2
0433 EB EF          2744                 Jr      Nz,Chk_Pk3
0435                2745 
0435 AF          14 2746 CP_Ret:         Ret
0436                2747                 
0436 D6 02 00    20 2748 FreeP_Leave:    Call    Clr_BankSwitch ;get to a known state
0439                2749                 
0439 31 00        6 2750                 Srp     #Wrk_Io
043B AC 01        6 2751                 Ld      !rA,#$01 ;initial response
043D BC 00        6 2752                 Ld      !rB,#$00 ;Cmnd_Pending, IBsy := False
043F CC 10        6 2753                 Ld      !rC,#.HIBYTE. Cmnd_Ptr
0441 DC 1A        6 2754                 Ld      !rD,#.LOWBYTE. Cmnd_Ptr
0443 8D 02 82       2755                 Jp      Wait_Cmd
0446                2756                 
0446                2757                 .LSTOFF
0446                2759                 .LSTON































        WIDGET.ASSEM            Page  84
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0446                2760                 .Page
0446                2761 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0446                2762 ;>
0446                2763 ;>      Function: Format Block
0446                2764 ;>
0446                2765 ;>      This function performs the actual formatting of a sector.
0446                2766 ;>      It is assumed that the heads are positioned over the correct
0446                2767 ;>      cylinder and that the correct head has been selected. The
0446                2768 ;>      header that is laid down on the track is derived from the
0446                2769 ;>      information in the global variables in cylinder, head, and
0446                2770 ;>      sector. It is also assumed that memory space FormatArray has
0446                2771 ;>      initialized to all zeros before entering this routine.
0446                2772 ;>
0446                2773 ;>      Inputs:
0446                2774 ;>              Parent : BYTE { !r8 }
0446                2775 ;>
0446                2776 ;>      Outputs:
0446                2777 ;>              FmtBlock    : BOOLEAN { Zero flag, true if error in ReadBlock }
0446                2778 ;>              Status      : BYTE { !r0 }
0446                2779 ;>
0446                2780 ;>      Global Variables Used:
0446                2781 ;>              Cylinder, Head, Sector, Recovery
0446                2782 ;>
0446                2783 ;>      Local Variables Used:
0446                2784 ;>              FmtError    : BOOLEAN { !r9/bit 7 }
0446                2785 ;>              FmtExcept   : BOOLEAN { !r9/bit 6 }
0446                2786 ;>              FmtSuccess  : BOOLEAN { !r9/bit 5 }
0446                2787 ;>
0446                2788 ;>      Algorithm:
0446                2789 ;>
0446                2790 ;>      BEGIN
0446                2791 ;>       SetDeadManTimer( FormatBlock, Parent )
0446                2792 ;>       FmtRetryCnt := 10
0446                2793 ;>       FmtErrCnt := 0
0446                2794 ;>       FmtError := False
0446                2795 ;>       FmtExcept := False
0446                2796 ;>       SectorsRead := 2 * NbrSctrs { try to find header for two rotations }
0446                2797 ;>        FHdrSync := $0100
0446                2798 ;>        FHeader[ 1 ] := HiCylinder
0446                2799 ;>        FHeader[ 2 ] := LoCylinder
0446                2800 ;>        FHeader[ 3 ]/bits 7:6 := Head
0446                2801 ;>        FHeader[ 3 ]/bits 5:0 := Sector
0446                2802 ;>        FHeader[ 4 ] := Invert( FHeader[ 1 ] )
0446                2803 ;>        FHeader[ 5 ] := Invert( FHeader[ 2 ] )
0446                2804 ;>        FHeader[ 6 ] := Invert( FHeader[ 3 ] )
0446                2805 ;>       _
0446                2806 ;>      /
0446                2807 ;>   R  |  Set-up external ram address counter for FORMAT
0446                2808 ;>   E  |  Msel0:1 := Disk <--> Mem
0446                2809 ;>   S  |  WHILE SectorMark DO BEGIN END
0446                2810 ;>   I  |  StartL := True
0446                2811 ;>   D  |  WHILE NOT( SectorDnL ) DO BEGIN END
0446                2812 ;>   E  |  Status := Status_Port
0446                2813 ;>   N  |  StartL := False





        WIDGET.ASSEM            Page  85
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0446                2814 ;>   T  |  Msel0:1 := Z8 <--> Mem
0446                2815 ;>      \_
0446                2816 ;>
0446                2817 ;>        IF NOT( Status.State = NormFmtState )
0446                2818 ;>          THEN 
0446                2819 ;>              Reset_StateMachine
0446                2820 ;>              Abort
0446                2821 ;>
0446                2822 ;>        IF Status.ServoErr OR NOT( ServoRdy )
0446                2823 ;>          THEN
0446                2824 ;>              FmtError := True
0446                2825 ;>              FmtExcept := True
0446                2826 ;>
0446                2827 ;>        IF Status.WtNvldL
0446                2828 ;>         THEN FmtError := True
0446                2829 ;>       ClearDeadManTimer
0446                2830 ;>       Status/bit 7 := FmtError
0446                2831 ;>       Status/bit 6 := FmtExcept
0446                2832 ;>      END
0446                2833 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0446                2834                 .LSTOFF
0446                2837                 .LSTON





































        WIDGET.ASSEM            Page  86
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0446                2838                 .Page
0446                2839                 .FIN
0446                2840                 
0446                2841 FormatBlock:
0446 B0 E9        6 2842                 Clr     !r9     ;clear booleans
0448                2843                 
0448 2C 10        6 2844 FmtBlk_Rpt:     Ld      !r2,#.HIBYTE. FmtDelay
044A 3C 07        6 2845                 Ld      !r3,#.LOWBYTE. FmtDelay
044C C2 12       12 2846                 Ldc     !r1,@!!r2
044E 2C 10        6 2847                 Ld      !r2,#.HIBYTE. FormatArray ;initialize gaps
0450 3C 20        6 2848                 Ld      !r3,#.LOWBYTE. FormatArray
0452 B0 E0        6 2849                 Clr     !r0
0454 92 02       12 2850 FmtBlk_1:       Lde     @!!r2,!r0
0456 A0 E2       10 2851                 Incw    !!r2
0458 1A FA          2852                 Djnz    !r1,FmtBlk_1
045A                2853                 
045A 2C 10        6 2854                 Ld      !r2,#.HIBYTE. FHdrSync
045C 3C 3A        6 2855                 Ld      !r3,#.LOWBYTE. FHdrSync
045E 0C 01        6 2856                 Ld      !r0,#$01        ;load header sync
0460 92 02       12 2857                 Lde     @!!r2,!r0
0462 A0 E2       10 2858                 Incw    !!r2
0464 B0 E0        6 2859                 Clr     !r0
0466 92 02       12 2860                 Lde     @!!r2,!r0
0468 A0 E2       10 2861                 Incw    !!r2
046A                2862                 
046A D6 10 10    20 2863                 Call    LH_Vector
046D                2864                 
046D 2C 10        6 2865                 Ld      !r2,#.HIBYTE. FDataSync ;load data sync bit
046F 3C 50        6 2866                 Ld      !r3,#.LOWBYTE. FDataSync
0471 0C 01        6 2867                 Ld      !r0,#$01
0473 92 02       12 2868                 Lde     @!!r2,!r0
0475                2869                 
0475 D6 03 24    20 2870                 Call    Fmt_Resident     ;go internal to the Z8
0478                2871 
0478 18 E0        6 2872                 Ld      !r1,!r0         ;CASE Status.State
047A 56 E1 0F    10 2873                 And     !r1,#$0F
047D A6 E1 0A    10 2874                 Cp      !r1,#NormFmt_State
0480 6B 08          2875                 Jr      Z,Fmt_Norm
0482                2876                 
0482 D6 05 AE    20 2877                  Call   Reset_StMach
0485 A8 E0        6 2878                  Ld     !rA,!r0
0487 D6 05 1F    20 2879                 Call    Abort
048A                2880                 
048A 18 E0        6 2881 Fmt_Norm:       Ld      !r1,!r0         ;IF ServorErr OR NOT( ServoRdy )
048C 76 E1 10    10 2882                 Tm      !r1,#ServoErr
048F EB 05          2883                 Jr      Nz,Fmt_ServoErr
0491 76 E1 20    10 2884                 Tm      !r1,#ServoRdy
0494 EB 05          2885                 Jr      Nz,Fmt_SrvoOk
0496                2886                 
0496 46 E9 C0    10 2887 Fmt_ServoErr:   Or      !r9,#FmtError + FmtSrvoErr ; THEN FmtError AND FmtSrvoErr
0499 8B 08          2888                 Jr      FmtBlk_End
049B                2889                 
049B 76 E0 40    10 2890 Fmt_SrvoOk:    Tm      !r0,#WrtNvldL    ;IF Status.WrtNvldL
049E EB 03          2891                 Jr      Nz,FmtBlk_End





        WIDGET.ASSEM            Page  87
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04A0                2892                 
04A0 46 E9 80    10 2893                 Or      !r9,#FmtError
04A3                2894                 
04A3 08 E9        6 2895 FmtBlk_End:     Ld      !r0,!r9 ;send status back to caller
04A5 99 28        6 2896                 Ld      WrStat,!r9
04A7                2897                 
04A7 66 E0 80    10 2898                 Tcm     !r0,#FmtError ;set zero flag if error
04AA AF          14 2899                 Ret
04AB                2900                 
04AB                2901                 .LSTOFF
04AB                2906                 .LSTON
















































        WIDGET.ASSEM            Page  88
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04AB                2907                 .Page
04AB                2908 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04AB                2909 ;>
04AB                2910 ;>      Module: BS
04AB                2911 ;>
04AB                2912 ;>      This module contains all the routines that are used in bankswitching.
04AB                2913 ;>
04AB                2914 ;>      PROCEDURE Bank_Call( Address : PTR { !!r0 } )
04AB                2915 ;>      PROCEDURE LookUp_Rom( HiAddress : BYTE { !r0 }
04AB                2916 ;>      PROCEDURE Bank_Ret
04AB                2917 ;>
04AB                2918 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04AB                2919                 .LSTOFF
04AB                2922                 .LSTON













































        WIDGET.ASSEM            Page  89
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04AB                2923                 .Page
04AB                2924 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04AB                2925 ;>
04AB                2926 ;>      Procedure: Bank_Call
04AB                2927 ;>
04AB                2928 ;>      This procedure manages subroutine calls from one bank of
04AB                2929 ;>      the controllers external program space to the other. If
04AB                2930 ;>      one routine wants to call another routine in a different 
04AB                2931 ;>      memory bank it must do indirectly through this routine.
04AB                2932 ;>
04AB                2933 ;>      Inputs:
04AB                2934 ;>              Address : PTR { !!r2 }
04AB                2935 ;>
04AB                2936 ;>      Outputs: { none }
04AB                2937 ;>
04AB                2938 ;>      Algorithm:
04AB                2939 ;>
04AB                2940 ;>      BEGIN
04AB                2941 ;>       LookUp_Rom( Address DIV 256 )
04AB                2942 ;>       Goto @Address
04AB                2943 ;>      END
04AB                2944 ;>
04AB                2945 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04AB                2946                 .LSTOFF
04AB                2949                 .LSTON


































        WIDGET.ASSEM            Page  90
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04AB                2950                 .Page
04AB                2951                 .FIN
04AB                2952 
04AB                2953 Bank_Call:
04AB 70 FD          2954                 Push    Rp
04AD E4 FD 34    10 2955                 Ld      Wrk_Sys2+$4,Rp ;save Rp for reference later
04B0 31 30        6 2956                 Srp     #Wrk_Sys2
04B2                2957                 
04B2 06 E4 02    10 2958                 Add     !r4,#2 ;get reg 2 in original Rp
04B5 E3 04        6 2959                 Ld      !r0,@!r4 ;get hibyte of called adr
04B7 D6 04 BE    20 2960                 Call    LookUp_Rom
04BA                2961                 
04BA 50 FD       10 2962                 Pop     Rp
04BC 30 E2        8 2963                 Jp      @!r2
04BE                2964                 
04BE                2965                 .LSTOFF
04BE                2967                 .LSTON
04BE                2968 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04BE                2969 ;>
04BE                2970 ;>      Procedure: LookUp_Rom
04BE                2971 ;>
04BE                2972 ;>      This procedure is used to determine which of five 4k
04BE                2973 ;>      banks of program space the user wishes to execute within.
04BE                2974 ;>
04BE                2975 ;>      Inputs:
04BE                2976 ;>              HighAddress : BYTE { !r0 }
04BE                2977 ;>
04BE                2978 ;>      Outputs: none
04BE                2979 ;>
04BE                2980 ;>      Algorithm:
04BE                2981 ;>
04BE                2982 ;>      BEGIN
04BE                2983 ;>       CASE HighAddress OF
04BE                2984 ;>        0 : Adr13 := 0, Adr12 := 0
04BE                2985 ;>        1 : Adr13 := 0, Adr12 := 0
04BE                2986 ;>        2 : Adr13 := 0, Adr12 := 1
04BE                2987 ;>        3 : Adr13 := 1, Adr12 := 0
04BE                2988 ;>        4 : Adr13 := 1, Adr12 := 1
04BE                2989 ;>       OTHERWISE Abort
04BE                2990 ;>      END
04BE                2991 ;>
04BE                2992 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04BE                2993                 .LSTOFF
04BE                2996                 .LSTON















        WIDGET.ASSEM            Page  91
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04BE                2997                 .Page
04BE                2998                 .FIN
04BE                2999                 
04BE 76 E0 80    10 3000 LookUp_Rom:     Tm      !r0,#$80 ;check for adr out of range
04C1 EB 08          3001                 Jr      Nz,LU_Abort
04C3 56 E0 70    10 3002                 And     !r0,#$70 ;mask off unnecessary stuff from address
04C6 A6 E0 40    10 3003                 Cp      !r0,#$40
04C9 2B 03          3004                 Jr      Le,BC_1
04CB                3005                 
04CB D6 05 1F    20 3006 LU_Abort:       Call    Abort
04CE                3007 
04CE 2C 04        6 3008 BC_1:           Ld      !r2,#.HIBYTE. Rom_Table
04D0 3C EE        6 3009                 Ld      !r3,#.LOWBYTE. Rom_Table
04D2 F0 E0        8 3010                 Swap    !r0 ;turn highaddress into index value
04D4 90 E0        6 3011                 Rl      !r0 ;multiply index by 2 { 2 byte/element table }
04D6 02 30        6 3012                 Add     !r3,!r0 ;index into table
04D8 16 E2 00    10 3013                 Adc     !r2,#0
04DB C2 12       12 3014                 Ldc     !r1,@!!r2 ;get rom address values
04DD A0 E2       10 3015                 Incw    !!r2
04DF C2 02       12 3016                 Ldc     !r0,@!!r2
04E1                3017                 
04E1 2C 1E        6 3018                 Ld      !r2,#.HIBYTE. RomBank0
04E3 38 E0        6 3019                 Ld      !r3,!r0
04E5 92 32       12 3020                 Lde     @!!r2,!r3 ;set EpromBank0,1
04E7 2C 1D        6 3021                 Ld      !r2,#.HIBYTE. RomBank2
04E9 38 E1        6 3022                 Ld      !r3,!r1
04EB 92 32       12 3023                 Lde     @!!r2,!r3 ;set EpromBank2,3
04ED AF          14 3024                 Ret
04EE                3025                 
04EE 00 00          3026 RomTable:       .DB     0,0 ;Adr13 := 0, Adr12 := 0
04F0 00 00          3027                 .DB     0,0 ;Adr13 := 0, Adr12 := 0
04F2 00 01          3028                 .DB     0,1 ;Adr13 := 0, Adr12 := 1
04F4 01 00          3029                 .DB     1,0 ;Adr13 := 1, Adr12 := 0
04F6 01 01          3030                 .DB     1,1 ;Adr13 := 1, Adr12 := 1
04F8                3031                 
04F8                3032                 .LSTOFF
04F8                3034                 .LSTON






















        WIDGET.ASSEM            Page  92
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04F8                3035                 .Page
04F8                3036 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04F8                3037 ;>
04F8                3038 ;>      Procedure: Bank_Ret
04F8                3039 ;>
04F8                3040 ;>      This procedure is used as the return linkage when another
04F8                3041 ;>      procedure wishes to return to a location that is not
04F8                3042 ;>      in the same external program bank.
04F8                3043 ;>
04F8                3044 ;>      Inputs: { none }
04F8                3045 ;>
04F8                3046 ;>      Outputs: { none }
04F8                3047 ;>
04F8                3048 ;>      Algorithm:
04F8                3049 ;>
04F8                3050 ;>      BEGIN
04F8                3051 ;>       Address.HiByte := Stack[ StackPtr ]
04F8                3052 ;>       Address.LoByte := Stack[ StackPtr - 1 ]
04F8                3053 ;>       LookUp_Rom( Address DIV 256 )
04F8                3054 ;>       Goto @Address
04F8                3055 ;>      END
04F8                3056 ;>
04F8                3057 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04F8                3058                 .LSTOFF
04F8                3061                 .LSTON


































        WIDGET.ASSEM            Page  93
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


04F8                3062                 .Page
04F8                3063                 .FIN
04F8                3064 
04F8                3065 Bank_Ret:
04F8 70 FC          3066                 Push    Flags
04FA 70 FD          3067                 Push    Rp
04FC 31 30        6 3068                 Srp     #Wrk_Sys2
04FE                3069                 
04FE 18 FF        6 3070                 Ld      !r1,Spl ;get location of return adr
0500 06 E1 02    10 3071                 Add     !r1,#2  ;account for the 2 pushes at entry of routine
0503 E3 01        6 3072                 Ld      !r0,@!r1
0505 D6 04 BE    20 3073                 Call    LookUp_Rom
0508                3074 
0508 50 FD       10 3075                 Pop     Rp
050A 50 FC       10 3076                 Pop     Flags
050C AF          14 3077                 Ret
050D                3078                 
050D                3079                 .LSTOFF
050D                3084                 .LSTON








































        WIDGET.ASSEM            Page  94
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


050D                3085                 .Page
050D                3086 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
050D                3087 ;>
050D                3088 ;>      Module: Int.Assem  { Interrupt Handler }
050D                3089 ;>
050D                3090 ;>      This module contains all the routines associated with
050D                3091 ;>      the various interrupts that the Widget controller deals with.
050D                3092 ;>
050D                3093 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
050D                3094                 .LSTOFF
050D                3097                 .LSTON
















































        WIDGET.ASSEM            Page  95
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


050D                3098                 .Page
050D                3099 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
050D                3100 ;>
050D                3101 ;>      Procedure: Vector0:4 { Illegal Interrupts }
050D                3102 ;>
050D                3103 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
050D                3104                 .LSTOFF
050D                3107                 .LSTON



















































        WIDGET.ASSEM            Page  96
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


050D                3108                 .Page
050D                3109                 .FIN
050D                3110                 
050D                3111 Vector0:
050D                3112 Vector1:
050D                3113 Vector2:
050D                3114 Vector3:
050D                3115 Vector4:
050D 50 E9       10 3116                 Pop     !r9     ;pop flags
050F 50 EA       10 3117                 Pop     !rA     ;pop return address
0511 50 EB       10 3118                 Pop     !rB
0513 D6 05 1F    20 3119                 Call    Abort
0516                3120                 
0516                3121                 .LSTOFF
0516                3123                 .LSTON












































        WIDGET.ASSEM            Page  97
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0516                3124                 .Page
0516                3125 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0516                3126 ;>
0516                3127 ;>      Procedure: Vector5 { Irq5 Interrupt }
0516                3128 ;>
0516                3129 ;>      This procedure decrements the DeadMan Timer counter. If the
0516                3130 ;>      result is zero then Abort
0516                3131 ;>
0516                3132 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0516                3133                 .LSTOFF
0516                3136                 .LSTON
















































        WIDGET.ASSEM            Page  98
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0516                3137                 .Page
0516                3138                 .FIN
0516                3139 
0516                3140 Vector5:
0516 80 36       10 3141                 Decw    Dmt_Counter
0518 6B F3          3142                 Jr      Z,Vector4 ;abort if zero
051A                3143                 
051A 56 FA DF    10 3144                 And     Irq,#$FF-Timer1 ;clear old interrupt
051D 9F           6 3145                 Ei
051E BF          16 3146                 Iret
051F                3147                 
051F                3148                 .LSTOFF
051F                3155                 .LSTON














































        WIDGET.ASSEM            Page  99
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


051F                3156                 .Page
051F                3157 ;>>>>>>>>>>>>>>>>>>>>>>>>
051F                3158 ;>
051F                3159 ;>      Module: Exception Handling
051F                3160 ;>
051F                3161 ;>      PROCEDURE: Abort
051F                3162 ;>      PROCEDURE: Status_Call
051F                3163 ;>      PROCEDURE: Reset_StMach
051F                3164 ;>
051F                3165 ;>>>>>>>>>>>>>>>>>>>>>>>>
051F                3166                 .LSTOFF
051F                3169                 .LSTON















































        WIDGET.ASSEM            Page 100
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


051F                3170                 .Page
051F                3171 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
051F                3172 ;>
051F                3173 ;>      Procedure: Abort
051F                3174 ;>
051F                3175 ;>      This procedure is the 'garbage-collector' for this set of
051F                3176 ;>      firmware. Abort is the place where all routines 'goto' if
051F                3177 ;>      things get so screwed up that they can no longer cope.
051F                3178 ;>
051F                3179 ;>      Inputs: { none; address of caller on stack }
051F                3180 ;>
051F                3181 ;>      Outputs: { none }
051F                3182 ;>
051F                3183 ;>      Algorithm:
051F                3184 ;>
051F                3185 ;>      BEGIN
051F                3186 ;>       Except_Stat.Recovery := False
051F                3187 ;>       DiskStat.Parked := False
051F                3188 ;>       DiskStat.On_Track := False
051F                3189 ;>       Clr_BankSwitch
051F                3190 ;>       Set_RamBank( Ram0 )
051F                3191 ;>       Registers !rE and !rF get address of  caller
051F                3192 ;>       FOR i := 0 TO $F DO
051F                3193 ;>        Abort_Stat[ i ] := Register[ Rp+i ]
051F                3194 ;>       Initialize internal and external stacks
051F                3195 ;>       ZeroBlock( ReadArray )
051F                3196 ;>       Initialize Write_Buffer Fence
051F                3197 ;>       SetStatus( Abort )
051F                3198 ;>       GoTo RdLeave
051F                3199 ;>      END
051F                3200 ;>
051F                3201 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
051F                3202                 .LSTOFF
051F                3205                 .LSTON

























        WIDGET.ASSEM            Page 101
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


051F                3206                 .Page
051F                3207                 .FIN
051F                3208 
051F                3209 Abort:
051F 8F           6 3210                 Di
0520                3211                  
0520 50 EE       10 3212                 Pop     !rE ;remember who called us
0522 50 EF       10 3213                 Pop     !rF
0524 70 FD          3214                 Push    Rp  ;save context
0526 31 40        6 3215                 Srp     #Wrk_Scr
0528                3216                 
0528 D6 02 00    20 3217                 Call    Clr_BankSwitch
052B                3218                 
052B 50 E0       10 3219                 Pop     !r0 ;get caller's context from stack
052D 1C 10        6 3220                 Ld      !r1,#16 ;load 16 locations
052F EC 16        6 3221                 Ld      !rE,#.HIBYTE. Abort_Stat
0531 FC D8        6 3222                 Ld      !rF,#.LOWBYTE. Abort_Stat
0533                3223                 
0533 93 0E       18 3224 Abort_Lp1:      Ldei    @!!rE,@!r0
0535 1A FC          3225                 Djnz    !r1,Abort_Lp1
0537                3226                 
0537 31 10        6 3227                 Srp     #Wrk_Sys
0539 B0 FE        6 3228                 Clr     Sph ;clean up the stack
053B E6 FF 80    10 3229                 Ld      Spl,#Stack_Top
053E                3230                 
053E D6 10 29    20 3231                 Call    ExtStk_Vector
0541                3232                 
0541 D6 10 31    20 3233                 Call    ZrRd_Vector
0544                3234                 
0544 EC 12        6 3235                  Ld     !rE,#.HIBYTE. WBlkFence ;re-write the write block fence
0546 FC 70        6 3236                  Ld     !rF,#.LOWBYTE. WBlkFence
0548 D6 10 19    20 3237                 Call    LdPw_Vector
054B                3238                 
054B 76 56 04    10 3239                 Tm      DiskStat,#MultiBlk
054E 6B 03          3240                 Jr      Z,Abt_Stat_Ld
0550                3241                 
0550 D6 05 65    20 3242                 Call    UpDate_Logical
0553                3243                 
0553 D6 05 80    20 3244 Abt_Stat_Ld:    Call    SS_Abort
0556                3245                 
0556 76 02 08    10 3246                 Tm      Port2,#Bsy ;check if BSY is set
0559 ED 10 13       3247                 Jp      Nz,RdL_Vector
055C                3248                 
055C 31 00        6 3249                 Srp     #Wrk_Io
055E AC 01        6 3250                 Ld      !rA,#Init_Response
0560 BC 00        6 3251                 Ld      !rB,#00
0562 8D 02 78       3252                 Jp      Clr_Bsy1
0565                3253                 
0565                3254                 
0565                3255 UpDate_Logical: 
0565 D6 10 0D    20 3256                 Call    LL_Vector
0568 02 E5        6 3257                 Add     !rE,!r5
056A 16 ED 00    10 3258                 Adc     !rD,#0
056D 16 EC 00    10 3259                 Adc     !rC,#0





        WIDGET.ASSEM            Page 102
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0570 0C 1C        6 3260                 Ld      !r0,#Wrk_Sys+$C
0572 1C 03        6 3261                 Ld      !r1,#3
0574 2C 14        6 3262                 Ld      !r2,#.HIBYTE. LogicalBlock
0576 3C A1        6 3263                 Ld      !r3,#.LOWBYTE. LogicalBlock
0578                3264                 
0578 93 02       18 3265 UpD_Lgcl_Lp:    Ldei    @!!r2,@!r0
057A 1A FC          3266                 Djnz    !r1,UpD_Lgcl_Lp
057C                3267                 
057C 56 56 FB    10 3268                 And     DiskStat,#$FF-MultiBlk
057F AF          14 3269                 Ret
0580                3270                 
0580                3271                 .LSTOFF
0580                3273                 .LSTON














































        WIDGET.ASSEM            Page 103
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0580                3274                 .Page
0580                3275 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0580                3276 ;>
0580                3277 ;>      ProcedureSet: SetStatus_Calls
0580                3278 ;>
0580                3279 ;>      These are a few of the more commonly used SetStatus routines:
0580                3280 ;>
0580                3281 ;>      SS_Abort: SetStatus( Abort )
0580                3282 ;>                SetStatus( OperationFailed )
0580                3283 ;>
0580                3284 ;>      SS_OpFail: SetStatus( OperationFailed )
0580                3285 ;>
0580                3286 ;>      SS_ReadErr: SetStatus( ReadErrCount )
0580                3287 ;>
0580                3288 ;>      SS_NoHdr: SetStatus( NoHeaderFound )
0580                3289 ;>
0580                3290 ;>      SS_SprWarn: SetStatus( SprBlk_Warn )
0580                3291 ;>
0580                3292 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0580                3293                 .LSTOFF
0580                3296                 .LSTON






































        WIDGET.ASSEM            Page 104
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0580                3297                 .Page
0580                3298                 .FIN
0580                3299 
0580 0C 01        6 3300 SS_Abort:        Ld     !r0,#1 ;byte 1
0582 1C 01        6 3301                  Ld     !r1,#Stat_Abort
0584 D6 04 03    20 3302                 Call    SetStatus
0587 0C 00        6 3303 SS_OpFail:       Ld     !r0,#0 ;byte 0
0589 1C 01        6 3304                  Ld     !r1,#Op_Failed
058B D6 04 03    20 3305 SS_Set:         Call    SetStatus
058E AF          14 3306                 Ret
058F                3307                 
058F 0C 03        6 3308 SS_RdCnt:       Ld      !r0,#3 ;byte 3
0591 18 27        6 3309                 Ld      !r1,RdErrCnt
0593 8B F6          3310                 Jr      SS_Set
0595                3311                 
0595 0C 00        6 3312 SS_ReadErr:      Ld     !r0,#0 ;byte 0
0597 1C 08        6 3313                  Ld     !r1,#Stat_Rd_Err
0599 D6 04 03    20 3314                 Call    SetStatus
059C 0C 03        6 3315                  Ld     !r0,#3
059E 18 27        6 3316                  Ld     !r1,RdErrCnt
05A0 8B E9          3317                 Jr      SS_Set
05A2                3318                 
05A2 0C 00        6 3319 SS_NoHdr:       Ld      !r0,#0 ;byte 0
05A4 1C 04        6 3320                 Ld      !r1,#Stat_NoHdr
05A6 8B E3          3321                 Jr      SS_Set
05A8                3322                 
05A8 0C 01        6 3323 SS_SprWarn:     Ld      !r0,#1 ;byte 1
05AA 1C 20        6 3324                 Ld      !r1,#SprBlk_Warn
05AC 8B DD          3325                 Jr      SS_Set
05AE                3326                 
05AE                3327                 .LSTOFF
05AE                3329                 .LSTON



























        WIDGET.ASSEM            Page 105
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


05AE                3330                 .Page
05AE                3331 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
05AE                3332 ;>
05AE                3333 ;>      Procedure: Reset_StMach
05AE                3334 ;>
05AE                3335 ;>      This routine is used in the case where the state machine
05AE                3336 ;>      ended abnormally { i.e., it ended in a state other than it's
05AE                3337 ;>      normal 'end-state' }. The assumption is made that the drive
05AE                3338 ;>      clock is not available and that the controller must supply
05AE                3339 ;>      a signal in it's place in order for the state machine to 
05AE                3340 ;>      reset.
05AE                3341 ;>
05AE                3342 ;>      Inputs: { none }
05AE                3343 ;>
05AE                3344 ;>      Outputs: { none }
05AE                3345 ;>
05AE                3346 ;>      Algorithm:
05AE                3347 ;>
05AE                3348 ;>      BEGIN
05AE                3349 ;>       Z8TestL := True
05AE                3350 ;>       FOR i := 16 DOWNTO 0 D0
05AE                3351 ;>              Zrwck := True
05AE                3352 ;>              Zrwck := False
05AE                3353 ;>       Z8TestL := False
05AE                3354 ;>      END
05AE                3355 ;>
05AE                3356 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
05AE                3357                 .LSTOFF
05AE                3360                 .LSTON






























        WIDGET.ASSEM            Page 106
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


05AE                3361                 .Page
05AE                3362                 .FIN
05AE                3363 
05AE                3364 Reset_StMach:
05AE 70 FD          3365                 Push    Rp ;save context
05B0 31 00        6 3366                 Srp     #Wrk_Io
05B2                3367                 
05B2 56 E0 BF    10 3368                 And     !Port0,#$FF-Not_ZTestL ;asset Z8TestL
05B5                3369                 
05B5 EC 10        6 3370                 Ld      !rE,#16 ;i := 16
05B7                3371                 
05B7 46 E3 40    10 3372 Res_StM_Lp:     Or      !Port3,#Zrwck ;set clock
05BA 56 E3 BF    10 3373                 And     !Port3,#$FF-Zrwck ;clear clock
05BD EA F8          3374                 Djnz    !rE,Res_StM_Lp
05BF                3375                 
05BF 46 E0 00    10 3376                 Or      !Port0,#ZTestL ;deassert Z8TestL
05C2 46 E0 40    10 3377                 Or      !Port0,#Zrwck ;set clock
05C5                3378                 
05C5 50 FD       10 3379                 Pop     Rp
05C7 AF          14 3380                 Ret
05C8                3381                 
05C8                3382                 .LSTOFF
05C8                3384                 .LSTON
05C8 00 00          3385 Int_Version:    .DB     $00, $00
05CA                3386                 .LSTOFF
05CA                3391                 .LSTON

































        WIDGET.ASSEM            Page 107
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


05CA                3392                 .Page
05CA                3393 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
05CA                3394 ;>
05CA                3395 ;>      Module: Resident Misc.
05CA                3396 ;>
05CA                3397 ;>      PROCEDURE ReSeek
05CA                3398 ;>      PROCEDURE New_Seek( Cylinder : WORD { !!rC }
05CA                3399 ;>                          Head     : BYTE { !rD }
05CA                3400 ;>                          Sector   : BYTE { !rE }
05CA                3401 ;>                        )
05CA                3402 ;>      PROCEDURE Load_Header( VAR BufferPtr : PTR { !!r2 } )
05CA                3403 ;>      FUNCTION Load_Logical : LogicalBlock : 3 BYTES { !rC:E }
05CA                3404 ;>      FUNCTION Chk_Chk_Byte( SourcePtr : PTR { !!rE }
05CA                3405 ;>                             SourceLength : BYTE { !!r8 }
05CA                3406 ;>                           ) :
05CA                3407 ;>                           BOOLEAN
05CA                3408 ;>      PROCEDURE Gen_Chk_Byte( SourcePtr : PTR { !!rE }
05CA                3409 ;>                             SourceLength : BYTE { !!r8 }
05CA                3410 ;>                            )
05CA                3411 ;>      PROCEDURE ClearStatus
05CA                3412 ;>      PROCEDURE Ld_LgclBlk( Offset : BYTE { !r0 } )
05CA                3413 ;>      PROCEDURE Set_SeekNeeded
05CA                3414 ;>
05CA                3415 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
05CA                3416                 .LSTOFF
05CA                3419                 .LSTON

































        WIDGET.ASSEM            Page 108
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


05CA                3420                 .Page
05CA                3421                 .FIN
05CA                3422 
05CA                3423 
05CA E6 57 90    10 3424 ReSeek:         Ld      SeekType,#Access_Offset
05CD 80 2A       10 3425                 Decw    SeekCount ;account for zero track seek
05CF                3426                 
05CF C8 52        6 3427                 Ld      !rC,Cylinder
05D1 D8 53        6 3428                 Ld      !rD,Cylinder+1
05D3 E8 54        6 3429                 Ld      !rE,Head
05D5 F8 55        6 3430                 Ld      !rF,Sector
05D7                3431 
05D7 2C 10        6 3432 New_Seek:        Ld     !r2,#.HIBYTE. Seek_Vector
05D9 3C 8D        6 3433                  Ld     !r3,#.LOWBYTE. Seek_Vector
05DB D6 04 AB    20 3434                 Call    Bank_Call
05DE 8D 04 F8       3435                 Jp      Bank_Ret
05E1                3436                 
05E1                3437                 .LSTOFF
05E1                3439                 .LSTON








































        WIDGET.ASSEM            Page 109
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


05E1                3440                 .Page
05E1                3441 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
05E1                3442 ;>
05E1                3443 ;>      Procedure: Load_Header
05E1                3444 ;>
05E1                3445 ;>      This procedure is responsible for generating ( and loading
05E1                3446 ;>      into the disk buffer ) the header that will be used to identify
05E1                3447 ;>      the correct block to operate on.
05E1                3448 ;>
05E1                3449 ;>      Inputs:
05E1                3450 ;>              BufferPtr: PTR { !!r2 }
05E1                3451 ;>
05E1                3452 ;>      Outputs:
05E1                3453 ;>              BufferPtr + 5 : PTR { !!r2 }
05E1                3454 ;>
05E1                3455 ;>      Algorithm:
05E1                3456 ;>
05E1                3457 ;>      BEGIN
05E1                3458 ;>       @BufferPtr( 0 ) := HiCylinder
05E1                3459 ;>       @BufferPtr( 1 ) := LoCylinder
05E1                3460 ;>       @BufferPtr( 2 )/bits 7:6 := Head
05E1                3461 ;>       @BufferPtr( 2 )/bits 5:0 := Sector
05E1                3462 ;>       @BufferPtr( 3 ) := Invert( @BufferPtr( 0 ) )
05E1                3463 ;>       @BufferPtr( 4 ) := Invert( @BufferPtr( 1 ) )
05E1                3464 ;>       @BufferPtr( 5 ) := Invert( @BufferPtr( 2 ) )
05E1                3465 ;>      END
05E1                3466 ;>
05E1                3467 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
05E1                3468                 .LSTOFF
05E1                3471                 .LSTON





























        WIDGET.ASSEM            Page 110
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


05E1                3472                 .Page
05E1                3473                 .FIN
05E1                3474 
05E1                3475 Load_Header:
05E1 0C 52        6 3476                 Ld      !r0,#Cylinder     ;load header: hi cylinder
05E3 93 02       18 3477                 Ldei    @!!r2,@!r0
05E5                3478                 
05E5 93 02       18 3479                 Ldei    @!!r2,@!r0       ;load lo cylinder
05E7                3480                 
05E7 E3 10        6 3481                 Ld      !r1,@!r0        ;Head
05E9 F0 E1        8 3482                 Swap    !r1
05EB 90 E1        6 3483                 Rl      !r1
05ED 90 E1        6 3484                 Rl      !r1
05EF                3485                 
05EF 0E           6 3486                 Inc     !r0
05F0 43 10        6 3487                 Or      !r1,@!r0        ;merge in Sector
05F2                3488                 
05F2 92 12       12 3489                 Lde     @!!r2,!r1       ;load Head/Sector
05F4 A0 E2       10 3490                 Incw    !!r2
05F6                3491                 
05F6 08 52        6 3492                 Ld      !r0,Cylinder    ;Not( hi cylinder )
05F8 60 E0        6 3493                 Com     !r0
05FA 92 02       12 3494                 Lde     @!!r2,!r0
05FC A0 E2       10 3495                 Incw    !!r2
05FE                3496                 
05FE 08 53        6 3497                 Ld      !r0,Cylinder+1  ;Not( lo cylinder )
0600 60 E0        6 3498                 Com     !r0
0602 92 02       12 3499                 Lde     @!!r2,!r0
0604 A0 E2       10 3500                 Incw    !!r2
0606                3501                 
0606 60 E1        6 3502                 Com     !r1             ;Not( Head/Sector )
0608 92 12       12 3503                 Lde     @!!r2,!r1
060A A0 E2       10 3504                 Incw    !!r2
060C                3505                 
060C AF          14 3506                 Ret
060D                3507                 
060D                3508                 .LSTOFF
060D                3510                 .LSTON





















        WIDGET.ASSEM            Page 111
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


060D                3511                 .Page
060D                3512 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
060D                3513 ;>
060D                3514 ;>      Function: Load_Logical
060D                3515 ;>
060D                3516 ;>      This function returns the last logical block number 
060D                3517 ;>      requested by the host.
060D                3518 ;>
060D                3519 ;>      Inputs: { none }
060D                3520 ;>
060D                3521 ;>      Outputs:
060D                3522 ;>              LogicalBlockNumber : 3 BYTES { !rC:E }
060D                3523 ;>
060D                3524 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
060D                3525                 .LSTOFF
060D                3528                 .LSTON











































        WIDGET.ASSEM            Page 112
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


060D                3529                 .Page
060D                3530                 .FIN
060D                3531                 
060D                3532 Load_Logical:
060D 2C 14        6 3533                 Ld      !r2,#.HIBYTE. LogicalBlock
060F 3C A1        6 3534                 Ld      !r3,#.LOWBYTE. LogicalBlock
0611 1C 03        6 3535                 Ld      !r1,#3
0613 08 FD        6 3536                 Ld      !r0,Rp
0615 46 E0 0C    10 3537                 Or      !r0,#$0C
0618                3538                 
0618 83 02       18 3539 Load_Log_Lp:    Ldei    @!r0,@!!r2
061A 1A FC          3540                 Djnz    !r1,Load_Log_Lp
061C                3541                 
061C AF          14 3542                 Ret
061D                3543                 
061D                3544                 .LSTOFF
061D                3546                 .LSTON










































        WIDGET.ASSEM            Page 113
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


061D                3547                 .Page
061D                3548 ;>>>>>>>>>>>>>>>>>>>>>>>>
061D                3549 ;>
061D                3550 ;>      Function: Chk_Chk_Byte
061D                3551 ;>      Inputs:
061D                3552 ;>              SourcePtr : PTR, { !!rE }
061D                3553 ;>              SourceLength : BYTE { !r8 }
061D                3554 ;>
061D                3555 ;>      Outputs:
061D                3556 ;>              If CheckBytes Match
061D                3557 ;>               Then Zero_Flag := True
061D                3558 ;>               Else Zero_Flag := False
061D                3559 ;>
061D                3560 ;>      Algorithm:
061D                3561 ;>       Begin
061D                3562 ;>        Temp := 0
061D                3563 ;>        For i := 1 To SourceLength Do
061D                3564 ;>         Temp := Temp + @SourcePtr
061D                3565 ;>         SourcePtr := SourcePtr + 1
061D                3566 ;>        Compare ( Temp, @SourcePtr )
061D                3567 ;>       End
061D                3568 ;>
061D                3569 ;>      Temp = !r0
061D                3570 ;>
061D                3571 ;>      Scratch Register = !r2
061D                3572 ;>
061D                3573 ;>>>>>>>>>>>>>>>>>>>>>>>>
061D                3574                 .LSTOFF
061D                3577                 .LSTON






























        WIDGET.ASSEM            Page 114
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


061D                3578                 .Page
061D                3579                 .FIN
061D                3580 
061D                3581 Chk_Chk_Byte:
061D B0 E0        6 3582                 Clr     !r0
061F                3583                 
061F 82 2E       12 3584 ChkB_Lp1:       Lde     !r2,@!!rE
0621 02 02        6 3585                 Add     !r0,!r2
0623 A0 EE       10 3586                 Incw    !!rE
0625 8A F8          3587                 Djnz    !r8,ChkB_Lp1
0627                3588                 
0627 60 E0        6 3589                 Com     !r0
0629 82 1E       12 3590                 Lde     !r1,@!!rE
062B A2 01        6 3591                 Cp      !r0,!r1         ;set/clear zero flag
062D AF          14 3592                 Ret
062E                3593                 
062E                3594                 .LSTOFF
062E                3596                 .LSTON









































        WIDGET.ASSEM            Page 115
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


062E                3597                 .Page
062E                3598 ;>>>>>>>>>>>>>>>>>>>>>>>>
062E                3599 ;>
062E                3600 ;>      Procedure: Gen_Chk_Byte
062E                3601 ;>
062E                3602 ;>      Inputs:
062E                3603 ;>              SourcePtr : PTR, { !!rE }
062E                3604 ;>              SourceLength : BYTE { !r8 }
062E                3605 ;>
062E                3606 ;>      Outputs: { none }
062E                3607 ;>
062E                3608 ;>      Algorithm:
062E                3609 ;>       Begin
062E                3610 ;>        Temp := 0
062E                3611 ;>        For i := 1 To SourceLength Do
062E                3612 ;>         Temp := Temp + @SourcePtr
062E                3613 ;>         SourcePtr := SourcePtr + 1
062E                3614 ;>        Temp := NOT( Temp )
062E                3615 ;>        @SourcePtr := Temp
062E                3616 ;>       End
062E                3617 ;>
062E                3618 ;>      Temp = !r0
062E                3619 ;>
062E                3620 ;>      Scratch Register = !r2
062E                3621 ;>
062E                3622 ;>>>>>>>>>>>>>>>>>>>>>>>>
062E                3623                 .LSTOFF
062E                3626                 .LSTON































        WIDGET.ASSEM            Page 116
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


062E                3627                 .Page
062E                3628                 .FIN
062E                3629 
062E                3630 Gen_Chk_Byte:
062E B0 E0        6 3631                 Clr     !r0
0630                3632                 
0630 82 2E       12 3633 Gen_ChkB_Lp1:   Lde     !r2,@!!rE
0632 02 02        6 3634                 Add     !r0,!r2
0634 A0 EE       10 3635                 Incw    !!rE
0636 8A F8          3636                 Djnz    !r8,Gen_ChkB_Lp1
0638                3637                 
0638 60 E0        6 3638                 Com     !r0
063A                3639                 
063A 92 0E       12 3640                 Lde     @!!rE,!r0
063C AF          14 3641                 Ret
063D                3642                 
063D                3643                 .LSTOFF
063D                3645                 .LSTON









































        WIDGET.ASSEM            Page 117
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


063D                3646                 .Page
063D                3647 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
063D                3648 ;>
063D                3649 ;>      Procedure: ClearStatus
063D                3650 ;>
063D                3651 ;>      This procedure clears all the bytes within the status array.
063D                3652 ;>
063D                3653 ;>      Inputs: { none }
063D                3654 ;>
063D                3655 ;>      Outputs: { none }
063D                3656 ;>
063D                3657 ;>      Algorithm:
063D                3658 ;>
063D                3659 ;>      BEGIN
063D                3660 ;>       FOR i := 1 TO Length( StatusArray ) DO
063D                3661 ;>        StatusArray[ i ] := 0
063D                3662 ;>      END
063D                3663 ;>
063D                3664 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
063D                3665                 .LSTOFF
063D                3668                 .LSTON






































        WIDGET.ASSEM            Page 118
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


063D                3669                 .Page
063D                3670                 .FIN
063D                3671 
063D                3672 ClearStatus:
063D 2C 14        6 3673                 Ld      !r2,#.HIBYTE. CStatus0
063F 3C 95        6 3674                 Ld      !r3,#.LOWBYTE. CStatus0
0641 B0 E0        6 3675                 Clr     !r0
0643 1C 1C        6 3676                 Ld      !r1,#( End_CStatus - CStatus0 ) ;clear all status bytes
0645                3677                 
0645 92 02       12 3678 Clr_Stat:       Lde     @!!r2,!r0
0647 A0 E2       10 3679                 Incw    !!r2
0649 1A FA          3680                 Djnz    !r1,Clr_Stat
064B 8D 04 F8       3681                 Jp      Bank_Ret
064E                3682                 
064E                3683                 .LSTOFF
064E                3685                 .LSTON











































        WIDGET.ASSEM            Page 119
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


064E                3686                 .Page
064E                3687 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
064E                3688 ;>
064E                3689 ;>      Procedure: Ld_LgclBlk   { Load Logical Block }
064E                3690 ;>
064E                3691 ;>      This procedure is used to extract the LogicalBlockNumber
064E                3692 ;>      information from a command string ( sent by the host ) and
064E                3693 ;>      move it into the global variable LogicalBlock.
064E                3694 ;>
064E                3695 ;>      Inputs:
064E                3696 ;>              Offset : BYTE { !r0 }
064E                3697 ;>
064E                3698 ;>      Outputs: { none }
064E                3699 ;>
064E                3700 ;>      Global Variables Changed:
064E                3701 ;>              LogicalBlock
064E                3702 ;>
064E                3703 ;>      Algorithm:
064E                3704 ;>
064E                3705 ;>      BEGIN
064E                3706 ;>       FOR i := 1 TO Length( LogicalBlock ) DO
064E                3707 ;>        LogicalBlock[ i ] := CmndArray.LogicalBlock[ i ]
064E                3708 ;>      END
064E                3709 ;>
064E                3710 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
064E                3711                 .LSTOFF
064E                3714                 .LSTON
































        WIDGET.ASSEM            Page 120
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


064E                3715                 .Page
064E                3716                 .FIN
064E                3717 
064E                3718 Ld_LgclBlk:
064E 09 40        6 3719                 Ld      ScrReg0,!r0 ;pass parameter
0650 70 FD          3720                 Push    Rp ;save context
0652 31 40        6 3721                 Srp     #Wrk_Scr
0654                3722                 
0654 2C 14        6 3723                  Ld     !r2,#.HIBYTE. CStatus4
0656 3C A5        6 3724                  Ld     !r3,#.LOWBYTE. CStatus4
0658 02 30        6 3725                  Add    !r3,!r0 ;add offset to BlockNumber
065A 16 E2 00    10 3726                  Adc    !r2,#0
065D EC 14        6 3727                  Ld     !rE,#.HIBYTE. LogicalBlock
065F FC A1        6 3728                  Ld     !rF,#.LOWBYTE. LogicalBlock
0661                3729                 
0661 1C 04        6 3730                  Ld     !r1,#4 ;move 4 bytes
0663 82 02       12 3731 Ld_Lgcl_Lp:      Lde    !r0,@!!r2
0665 92 0E       12 3732                  Lde    @!!rE,!r0
0667 A0 E2       10 3733                  Incw   !!r2
0669 A0 EE       10 3734                  Incw   !!rE
066B 1A F6          3735                  Djnz   !r1,Ld_Lgcl_Lp
066D                3736                 
066D 50 FD       10 3737                 Pop     Rp ;context switch
066F 8D 04 F8       3738                 Jp      Bank_Ret
0672                3739                 
0672                3740                 .LSTOFF
0672                3742                 .LSTON
































        WIDGET.ASSEM            Page 121
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0672                3743                 .Page
0672                3744 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0672                3745 ;>
0672                3746 ;>      Procedure: Set_SeekNeeded
0672                3747 ;>
0672                3748 ;>      This procedure acts in much the same fashion for the
0672                3749 ;>      LogicalBlockCache as DiskStat.On_Track does for simple
0672                3750 ;>      seeks. It keeps a legitimate seeks between tow requests
0672                3751 ;>      for the same block number from returning a bogus result.
0672                3752 ;>
0672                3753 ;>      Inputs: { none }
0672                3754 ;>
0672                3755 ;>      Outputs: { none }
0672                3756 ;>
0672                3757 ;>      Algorithm:
0672                3758 ;>
0672                3759 ;>      BEGIN
0672                3760 ;>       FOR i := 1 TO CacheLength DO
0672                3761 ;>        CachStat[ i ].SeekNeeded := True
0672                3762 ;>      END
0672                3763 ;>
0672                3764 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
0672                3765                 .LSTOFF
0672                3768                 .LSTON



































        WIDGET.ASSEM            Page 122
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0672                3769                 .Page
0672                3770                 .FIN
0672                3771 
0672                3772                
0672 2C 16        6 3773                 Ld      !r2,#.HIBYTE. CachStat
0674 3C E8        6 3774                 Ld      !r3,#.LOWBYTE. CachStat
0676 1C 14        6 3775                 Ld      !r1,#CacheLength
0678                3776 
0678 82 02       12 3777 S_SkN_Lp:       Lde     !r0,@!!r2 ;get array value
067A 46 E0 80    10 3778                 Or      !r0,#CachSeek
067D 92 02       12 3779                 Lde     @!!r2,!r0
067F A0 E2       10 3780                 Incw    !!r2
0681 1A F5          3781                 Djnz    !r1,S_SkN_Lp
0683                3782                 
0683 8D 04 F8       3783                 Jp      Bank_Ret
0686                3784                 
0686                3785                 .LSTOFF
0686                3792                 .LSTON









































        WIDGET.ASSEM            Page 123
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


0686                3793                 .Page
0686                3794                 .FIN
0686                3795                 
0686                3796                 .ORG    $1000 ;move this code into the eprom
1000                3797                 
1000                3798                 .DO     SystemCode
1000 00 00          3799 DevSubType      .Equ    $00 ;system device
1000   --SKIP--     3800                 .ELSE
1000   --SKIP--     3801 DevSubType      .Equ    $01 ;diagnostic device
1000                3802                 .FIN
1000                3803                 
1000 00 00          3804                 .BLOCK  0,2   ;reserve two bytes for the checkbyte
1002 00             3805                 .DB     0     ;bank 0
1003 F0 78 3C 1E    3806 PassWord:       .DB     $F0, $78, $3C, $1E
1007                3807 
1007                3808                 .DO     W_10MB
1007 1F             3809 FmtDelay:       .DB     $1F     ;busy wait for a while
1008   --SKIP--     3810                 .ELSE
1008   --SKIP--     3811 FmtDelay:       .DB     $1F
1008                3812                 .FIN
1008                3813 
1008                3814                 .DO     W_10MB
1008 01 01          3815 RWI_Cylinder    .Equ    257     ;cylinder at which to turn on RWI and PC
1008                3816                 .FIN
1008   --SKIP--     3817                 .DO     W_20MB
1008   --SKIP--     3818 RWI_Cylinder    .Equ    257     ;cylinder at which to turn on RWI and PC
1008                3819                 .FIN
1008   --SKIP--     3820                 .DO     W_40MB
1008   --SKIP--     3821 RWI_Cylinder    .Equ    514     ;cylinder at which to turn on RWI and PC
1008                3822                 .FIN
1008 01 01          3823 RWI_Value:      .DB     .HIBYTE. RWI_Cylinder, .LOWBYTE. RWI_Cylinder
100A                3824                 
100A                3825 B0_VctTab:
100A 8D 11 95       3826 Start_Vector:   Jp      Start_Command
100D 8D 06 0D       3827 LL_Vector:      Jp      Load_Logical
1010 8D 05 E1       3828 LH_Vector:      Jp      Load_Header
1013 8D 12 CA       3829 RdL_Vector:     Jp      Rd_Leave
1016 8D 1E 89       3830 CS_Vector:      Jp      ClrNormStat
1019                3831                  
1019 2C 25        6 3832 LdPw_Vector:     Ld     !r2,#.HIBYTE. Load_PassWord
101B 3C 07        6 3833                  Ld     !r3,#.LOWBYTE. Load_PassWord
101D D6 04 AB    20 3834                 Call    Bank_Call
1020 AF          14 3835                 Ret
1021                3836                 
1021 2C 2D        6 3837 Free_Vector:     Ld     !r2,#.HIBYTE. Strt_FreeProcess
1023 3C B2        6 3838                  Ld     !r3,#.LOWBYTE. Strt_FreeProcess
1025 D6 04 AB    20 3839                 Call    Bank_Call
1028 AF          14 3840                 Ret
1029                3841                 
1029 2C 22        6 3842 ExtStk_Vector:   Ld     !r2,#.HIBYTE. Init_ExtStack
102B 3C 0A        6 3843                  Ld     !r3,#.LOWBYTE. Init_ExtStack
102D D6 04 AB    20 3844                 Call    Bank_Call
1030 AF          14 3845                 Ret
1031                3846                 





        WIDGET.ASSEM            Page 124
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1031 2C 20        6 3847 ZrRd_Vector:     Ld     !r2,#.HIBYTE. Zero_RdBuf
1033 3C AC        6 3848                  Ld     !r3,#.LOWBYTE. Zero_RdBuf
1035 D6 04 AB    20 3849                 Call    Bank_Call
1038 AF          14 3850                 Ret
1039                3851 
1039 2C 06        6 3852 ClrStat_Vector:  Ld     !r2,#.HIBYTE. ClearStatus
103B 3C 3D        6 3853                  Ld     !r3,#.LOWBYTE. ClearStatus
103D D6 04 AB    20 3854                 Call    Bank_Call
1040 AF          14 3855                 Ret
1041                3856                 
1041 2C 2A        6 3857 SlfTst_Vector:   Ld     !r2,#.HIBYTE. SelfTest
1043 3C 11        6 3858                  Ld     !r3,#.LOWBYTE. SelfTest
1045 D6 04 AB    20 3859                 Call   Bank_Call
1048 AF          14 3860                 Ret
1049                3861 
1049 2C 23        6 3862 SprTbl_Vector:   Ld     !r2,#.HIBYTE. Load_SprTbl
104B 3C 23        6 3863                  Ld     !r3,#.LOWBYTE. Load_SprTbl
104D D6 04 AB    20 3864                 Call    Bank_Call
1050 AF          14 3865                 Ret
1051                3866 
1051 2C 2B        6 3867 LC_Vector:       Ld     !r2,#.HIBYTE. Load_Cache
1053 3C 45        6 3868                  Ld     !r3,#.LOWBYTE. Load_Cache
1055 D6 04 AB    20 3869                 Call    Bank_Call
1058 AF          14 3870                 Ret
1059                3871                 
1059 2C 2C        6 3872 Scan_Vector:     Ld     !r2,#.HIBYTE. D_Scan
105B 3C CF        6 3873                  Ld     !r3,#.LOWBYTE. D_Scan
105D D6 04 AB    20 3874                 Call    Bank_Call
1060 8D 12 CA       3875                 Jp      Rd_Leave
1063                3876 
1063                3877 IScan_Vector:
1063 0C 00        6 3878                 Ld      !r0,#DevSubType ;check for SystemCode
1065 42 00        6 3879                 Or      !r0,!r0 ;IF SystemCode THEN DevSubType = 0
1067 EB 13          3880                 Jr      Nz,IScan_Ret
1069 76 24 10    10 3881                 Tm      Excpt_Stat,#PwrRst ;only do scan after power reset
106C 6B 07          3882                 Jr      Z,IScan_SprChk
106E 2C 2C        6 3883                  Ld     !r2,#.HIBYTE. Scan
1070 3C DC        6 3884                  Ld     !r3,#.LOWBYTE. Scan
1072 D6 04 AB    20 3885                 Call    Bank_Call
1075 2C 25        6 3886 IScan_SprChk:    Ld     !r2,#.HIBYTE. Chk_SprCnt
1077 3C 4C        6 3887                  Ld     !r3,#.LOWBYTE. Chk_SprCnt
1079 D6 04 AB    20 3888                 Call    Bank_Call
107C AF          14 3889 IScan_Ret:      Ret
107D                3890                 
107D D6 1D E2    20 3891 WrBlk_Vector:   Call   WriteBlock
1080 8D 04 F8       3892 VctrB0_Ret:     Jp      Bank_Ret
1083                3893                 
1083 D6 1E CC    20 3894 RdBlk_Vector:   Call    ReadBlock
1086 8B F8          3895                 Jr      VctrB0_Ret
1088                3896                 
1088 D6 16 6A    20 3897 SC_Vector:      Call    Srch_Cache
108B 8B F3          3898                 Jr      VctrB0_Ret
108D                3899 
108D 2C 26        6 3900 Seek_Vector:     Ld     !r2,#.HIBYTE. Seek





        WIDGET.ASSEM            Page 125
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


108F 3C 50        6 3901                  Ld     !r3,#.LOWBYTE. Seek
1091 D6 04 AB    20 3902                 Call    Bank_Call
1094 8D 04 F8       3903                 Jp      Bank_Ret
1097                3904 
1097 2C 22        6 3905 ExtPush_Vector:  Ld     !r2,#.HIBYTE. Ext_Push
1099 3C 1B        6 3906                  Ld     !r3,#.LOWBYTE. Ext_Push
109B D6 04 AB    20 3907                 Call    Bank_Call
109E AF          14 3908                 Ret
109F                3909 
109F 2C 22        6 3910 ExtPop_Vector:   Ld     !r2,#.HIBYTE. Ext_Pop
10A1 3C 3C        6 3911                  Ld     !r3,#.LOWBYTE. Ext_Pop
10A3 D6 04 AB    20 3912                 Call    Bank_Call
10A6 AF          14 3913                 Ret
10A7                3914 
10A7                3915 DeviceParams:
10A7                3916                 .DO     W_10MB
10A7 57 69 64 67    3917                 .ASCII  'Widget-10    '
10B4 00 01 00       3918                 .DB     $00, $01, $0 + DevSubType
10B7 1A 43          3919                 .DB     HiRevNumber, LoRevNumber
10B9 00 4C 00       3920                 .DB     $00, $4C, $00
10BC 02 14          3921                 .DW     532 ;number of bytes per block
10BE 02 02          3922                 .DW     514 ;number of cylinders is 514
10C0 02             3923                 .DB     $02      ;number of heads is 2
10C1 13             3924                 .DB     NbrSctrs
10C2 00 00 4C       3925                 .DB     $00, $00, 76 ;number of spare possible
10C5                3926                 .LSTOFF
10C5                3929                 .LSTON
10C5                3930                 .FIN
10C5   --SKIP--     3931                 .DO     W_20MB
10C5   --SKIP--     3932                 .ASCII  'Widget-20    '
10C5   --SKIP--     3933                 .DB     $00, $01, $10 + DevSubType
10C5   --SKIP--     3934                 .DB     HiRevNumber, LoRevNumber
10C5   --SKIP--     3935                 .DB     $00, $98, $00
10C5   --SKIP--     3936                 .DW     532 ;number of bytes per block
10C5   --SKIP--     3937                 .DW     514 ;number of cylinders is 514
10C5   --SKIP--     3938                 .DB     $02      ;number of heads is 2
10C5   --SKIP--     3939                 .DB     NbrSctrs
10C5   --SKIP--     3940                 .DB     $00, $00, 76 ;number of spare possible
10C5   --SKIP--     3941                 .LSTOFF
10C5                3942                 .FIN
10C5                3943                 .DO     Internal
10C5                3944                 .LSTON
10C5                3945                 .FIN
10C5   --SKIP--     3946                 .DO     W_40MB
10C5   --SKIP--     3947                 .ASCII  'Widget-40    '
10C5   --SKIP--     3948                 .DB     $00, $01, $20 + DevSubType
10C5   --SKIP--     3949                 .DB     HiRevNumber, LoRevNumber
10C5   --SKIP--     3950                 .DB     $01, $30, $00
10C5   --SKIP--     3951                 .DW     532 ;number of bytes per block
10C5   --SKIP--     3952                 .DW     1028 ;number of cylinders is 1028
10C5   --SKIP--     3953                 .DB     $02      ;number of heads is 2
10C5   --SKIP--     3954                 .DB     NbrSctrs
10C5   --SKIP--     3955                 .DB     $00, $00, 76 ;number of spare possible
10C5   --SKIP--     3956                 .LSTOFF





        WIDGET.ASSEM            Page 126
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


10C5                3957                 .FIN
10C5                3958                 .DO     Internal
10C5                3959                 .LSTON
10C5                3960                 .FIN
10C5                3961                 
10C5 00 1E          3962 Dev_Parm_Len    .Equ    .PC. - DeviceParams
10C5                3963                 
10C5                3964                 .LSTOFF
10C5                3970                 .LSTON


















































        WIDGET.ASSEM            Page 127
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


10C5                3971                 .Page
10C5                3972 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
10C5                3973 ;>
10C5                3974 ;>      Module: Format Routines
10C5                3975 ;>
10C5                3976 ;>      This module contains all but the very most primitive of
10C5                3977 ;>      of procedures ( the routines that are resident are listed
10C5                3978 ;>      in the external spec's ) that concern themselves with performing
10C5                3979 ;>      a format operation.
10C5                3980 ;>
10C5                3981 ;>      PROCEDURE FormatTrack( Offset, InterLeave )
10C5                3982 ;>      PROCEDURE LocateSector
10C5                3983 ;>
10C5                3984 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
10C5                3985                 .LSTOFF
10C5                3988                 .LSTON











































        WIDGET.ASSEM            Page 128
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


10C5                3989                 .Page
10C5                3990 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
10C5                3991 ;>
10C5                3992 ;>      Procedure: FormatTrack
10C5                3993 ;>
10C5                3994 ;>      This function is responsible for formatting the track at which
10C5                3995 ;>      the heads are currently positioned.
10C5                3996 ;>
10C5                3997 ;>      Inputs:
10C5                3998 ;>              Offset : BYTE { !r4 }
10C5                3999 ;>              InterLeave : BYTE { !r5 }
10C5                4000 ;>
10C5                4001 ;>      Outputs: { none }
10C5                4002 ;>
10C5                4003 ;>      Algorithm:
10C5                4004 ;>
10C5                4005 ;>      BEGIN
10C5                4006 ;>       For i := 1 TO LENGTH( FormatArray ) DO
10C5                4007 ;>           FormatArray[ i ] := 0
10C5                4008 ;>       WHILE NOT( Index ) DO BEGIN END
10C5                4009 ;>       Turn on AC erase { FmenL }
10C5                4010 ;>       IF IndexMark
10C5                4011 ;>        THEN
10C5                4012 ;>         Turn Off AC erase
10C5                4013 ;>         WHILE ( Offset > 0 ) DO
10C5                4014 ;>                WHILE NOT( SectorMark ) DO BEGIN END
10C5                4015 ;>                WHILE SectorMark DO BEGIN END
10C5                4016 ;>                Offset := Offset - 1
10C5                4017 ;>         InterLeaveFactor := InterLeaveTable[ InterLeave ]
10C5                4018 ;>         Sector := 0
10C5                4019 ;>         FOR i := 1 TO Number Of Sectors DO
10C5                4020 ;>           IF NOT( FormatBlock ) THEN Abort
10C5                4021 ;>           Sector := ( Sector + InterLeaveFactor ) MOD NbrSctrs
10C5                4022 ;>      END
10C5                4023 ;>
10C5                4024 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
10C5                4025                 .LSTOFF
10C5                4028                 .LSTON





















        WIDGET.ASSEM            Page 129
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


10C5                4029                 .Page
10C5                4030                 .FIN
10C5                4031                 
10C5                4032                 .DO     W_10MB
10C5 02 01 07 0A    4033 InterTable:     .DB     2, 1, 7, 10, 8, 13, 3
10CC   --SKIP--     4034                 .ELSE
10CC   --SKIP--     4035 InterTable:     .DB     2, 1, 26, 10, 8, 13, 22
10CC                4036                 .FIN
10CC                4037                 
10CC                4038 FormatTrack:
10CC 2C 20        6 4039                  Ld     !r2,#.HIBYTE. Zero_Fmt
10CE 3C B5        6 4040                  Ld     !r3,#.LOWBYTE. Zero_Fmt
10D0 D6 04 AB    20 4041                 Call    Bank_Call
10D3 46 56 20    10 4042                 Or      DiskStat,#Wr_Op
10D6                4043                 
10D6 76 03 04    10 4044 FmtT_1:         Tm      Port3,#IndexMark    ;WHILE NOT( Index )
10D9 6B FB          4045                 Jr      Z,FmtT_1
10DB                4046                 
10DB 56 00 DF    10 4047                 And     Port0,#$FF-AcEraseL        ;turn on AC erase
10DE                4048                 
10DE 76 03 04    10 4049 FmtT_2:         Tm      Port3,#IndexMark    ;WHILE Index
10E1 EB FB          4050                 Jr      Nz,FmtT_2
10E3                4051                  
10E3 76 03 04    10 4052 FmtT_3:         Tm      Port3,#IndexMark    ;WHILE NOT( Index )
10E6 6B FB          4053                 Jr      Z,FmtT_3
10E8                4054                 
10E8 46 00 20    10 4055                 Or      Port0,#AcEraseL    ;turn off AC erase
10EB                4056                 
10EB 42 44        6 4057                 Or      !r4,!r4 ;test for 0 offset
10ED 6B 0A          4058                 Jr      Z,Fmt_Begin
10EF                4059                 
10EF 56 FA FB    10 4060 Fmt_Off1:       And     Irq,#$FF-Irq_Sector ;clear old sector mark
10F2                4061                 
10F2 76 FA 04    10 4062 Fmt_Off2:       Tm      Irq,#Irq_Sector ;wait for mark to pass
10F5 6B FB          4063                 Jr      Z,Fmt_Off2
10F7                4064                 
10F7 4A F6          4065                 Djnz    !r4,Fmt_Off1
10F9                4066                 
10F9 2C 10        6 4067 Fmt_Begin:      Ld      !r2,#.HIBYTE. InterTable
10FB 3C C5        6 4068                 Ld      !r3,#.LOWBYTE. InterTable
10FD 02 35        6 4069                 Add     !r3,!r5 ;get offset into table
10FF 16 E2 00    10 4070                 Adc     !r2,#0
1102                4071                 
1102 C2 62       12 4072                 Ldc     !r6,@!!r2
1104 B0 55        6 4073                 Clr     Sector ;sector := 0
1106                4074                 
1106 5C 13        6 4075                 Ld      !r5,#NbrSctrs
1108                4076                 
1108 1C 08        6 4077 FmtTrk_2:        Ld     !r1,#Dmt_FmtTrk
110A D6 04 46    20 4078                 Call    FormatBlock
110D EB 05          4079                 Jr      Nz,FmtT_Until
110F                4080                 
110F 98 E0        6 4081                  Ld      !r9,!r0 ;pass reason for abort
1111 D6 05 1F    20 4082                 Call    Abort





        WIDGET.ASSEM            Page 130
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1114                4083                 
1114 04 E6 55    10 4084 FmtT_Until:     Add     Sector,!r6  ;Sector := Sector + InterLeaveFactor
1117 A6 55 13    10 4085                 Cp      Sector,#NbrSctrs   ;Sector := Sector MOD NbrSctrs
111A 1B 03          4086                 Jr      Lt,FmtT2_Until
111C                4087                 
111C 26 55 13    10 4088                 Sub     Sector,#NbrSctrs   ;do MOD by subtraction
111F                4089                 
111F 5A E7          4090 FmtT2_Until:    Djnz    !r5,FmtTrk_2
1121                4091                 
1121 8D 04 F8       4092                 Jp      Bank_Ret
1124                4093                 
1124                4094                 .LSTOFF
1124                4096                 .LSTON














































        WIDGET.ASSEM            Page 131
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1124                4097                 .Page
1124                4098 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1124                4099 ;>
1124                4100 ;>      Procedure: LocateSector
1124                4101 ;>
1124                4102 ;>      This procedure returns to the caller just after the sector
1124                4103 ;>      mark representing the sector JUST BEFORE the sector of the
1124                4104 ;>      last seek address.
1124                4105 ;>
1124                4106 ;>      Inputs: { none }
1124                4107 ;>
1124                4108 ;>      Outputs: { none }
1124                4109 ;>
1124                4110 ;>      Global Variables Used:
1124                4111 ;>              Sector
1124                4112 ;>
1124                4113 ;>      Algorithm:
1124                4114 ;>
1124                4115 ;>      BEGIN
1124                4116 ;>       Offset := SpareTable.FmtOffset
1124                4117 ;>       InterL := SpareTable.InterLeave
1124                4118 ;>       SectorCount := 0
1124                4119 ;>       Temp := 0
1124                4120 ;>       WHILE NOT( Index ) DO BEGIN END
1124                4121 ;>       WHILE ( Offset <> 0 ) DO
1124                4122 ;>              Wait For End of Sector Mark
1124                4123 ;>       WHILE ( Temp MOD NbrSctrs <> Sector ) DO
1124                4124 ;>              Temp := Temp + InterL
1124                4125 ;>              i := i + 2 { count sectors at 2:1 interleave }
1124                4126 ;>       WHILE ( i <> 0 ) DO
1124                4127 ;>              Wait For End Of Sector Mark
1124                4128 ;>              i := i - 1
1124                4129 ;>      END
1124                4130 ;>
1124                4131 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1124                4132                 .LSTOFF
1124                4135                 .LSTON






















        WIDGET.ASSEM            Page 132
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1124                4136                 .Page
1124                4137                 .FIN
1124                4138 
1124                4139 LocateSector:
1124 0C 09        6 4140                  Ld     !r0,#Dmt_LctSctr
1126 D6 04 13    20 4141                 Call    Set_Dmt
1129                4142                 
1129 70 FD          4143                 Push    Rp ;save context
112B 31 30        6 4144                 Srp     #Wrk_Sys2
112D                4145                 
112D 2C 14        6 4146                 Ld      !r2,#.HIBYTE. Fmt_Offset
112F 3C C3        6 4147                 Ld      !r3,#.LOWBYTE. Fmt_Offset
1131 82 42       12 4148                 Lde     !r4,@!!r2 ;load offset value
1133 44 54 54    10 4149                 Or      Head,Head ;check for even/odd head
1136 6B 02          4150                 Jr      Z,Lct_Offset
1138 F0 E4        8 4151                 Swap    !r4
113A 56 E4 0F    10 4152 Lct_Offset:     And     !r4,#$0F
113D                4153                 
113D A0 E2       10 4154                 Incw    !!r2 ;point to interleave value
113F 82 52       12 4155                 Lde     !r5,@!!r2
1141                4156                 
1141 2C 10        6 4157                 Ld      !r2,#.HIBYTE. InterTable
1143 3C C5        6 4158                 Ld      !r3,#.LOWBYTE. InterTable
1145 02 35        6 4159                 Add     !r3,!r5 ;add in interleave value
1147 16 E2 00    10 4160                 Adc     !r2,#0
114A C2 52       12 4161                 Ldc     !r5,@!!r2 ;get real interleave value
114C                4162                 
114C 76 03 04    10 4163 LctSctr1:       Tm      Port3,#IndexMark ;WHILE Index DO BEGIN END
114F EB FB          4164                 Jr      Nz,LctSctr1
1151                4165                 
1151 76 03 04    10 4166 LctSctr2:       Tm      Port3,#IndexMark ;WHILE Not( Index ) DO BEGIN END
1154 6B FB          4167                 Jr      Z,LctSctr2
1156                4168                 
1156 56 FA FB    10 4169                 And     Irq,#$FF-Irq_Sector ;clear any old sector marks
1159                4170                 
1159 42 44        6 4171                 Or      !r4,!r4 ;IF Offset = 0 THEN we're already here!
115B 6B 05          4172                 Jr      Z,LctSctr4
115D                4173                 
115D 28 E4        6 4174                  Ld     !r2,!r4
115F D6 11 8A    20 4175                 Call    LctSctr3
1162                4176                 
1162 44 55 55    10 4177 LctSctr4:       Or      Sector,Sector ;IF Sector = 0 THEN We're already there
1165 6B 1B          4178                 Jr      Z,LctDone
1167                4179                 
1167 B0 E2        6 4180                 Clr     !r2
1169 B0 E4        6 4181                 Clr     !r4
116B                4182                 
116B A4 55 E4    10 4183 LctSctr5:       Cp      !r4,Sector ;see if we've found the sector
116E 6B 0F          4184                 Jr      Z,LctSctr6
1170 06 E2 02    10 4185                 Add     !r2,#2
1173 02 45        6 4186                 Add     !r4,!r5 ;temp := Temp + InterLeave Factor
1175 A6 E4 13    10 4187                 Cp      !r4,#NbrSctrs ;temp := temp MOD NbrSctrs
1178 1B F1          4188                 Jr      Lt,LctSctr5
117A 26 E4 13    10 4189                 Sub     !r4,#NbrSctrs





        WIDGET.ASSEM            Page 133
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


117D 8B EC          4190                 Jr      LctSctr5
117F                4191                 
117F D6 11 8A    20 4192 LctSctr6:       Call    LctSctr3
1182                4193                 
1182 D6 04 1F    20 4194 LctDone:        Call    Clr_Dmt
1185 50 FD       10 4195                 Pop     Rp ;restore original context
1187 8D 04 F8       4196                 Jp      Bank_Ret
118A                4197 
118A 76 FA 04    10 4198 LctSctr3:       Tm      Irq,#Irq_Sector ;wait for next sector
118D 6B FB          4199                 Jr      Z,LctSctr3
118F 56 FA FB    10 4200                 And     Irq,#$FF-Irq_Sector ;mask old interrupt
1192 2A F6          4201                 Djnz    !r2,LctSctr3 ;count the number of sector in offset
1194 AF          14 4202                 Ret
1195                4203                 
1195                4204                 .LSTOFF
1195                4209                 .LSTON











































        WIDGET.ASSEM            Page 134
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1195                4210                 .Page
1195                4211 ;>>>>>>>>>>>>>>>>>>>>>>>>
1195                4212 ;>
1195                4213 ;>      Module: Command_Driver
1195                4214 ;>
1195                4215 ;>      This module controls the way in which commands received by
1195                4216 ;>      the Host are executed. It's main responsibility is to determine
1195                4217 ;>      whether a command string is protected by a check byte ( the
1195                4218 ;>      original Profile commands are not ) and then decode the command
1195                4219 ;>      and pass control over to the correct driver routine to
1195                4220 ;>      execute the command. All exception handling at this level is
1195                4221 ;>      controlled by the individual command routines.
1195                4222 ;>
1195                4223 ;>      PROCEDURE Start_Command
1195                4224 ;>      PROCEDURE Pro_Read
1195                4225 ;>      FUNCTION Read_Common : BOOOEAN
1195                4226 ;>
1195                4227 ;>>>>>>>>>>>>>>>>>>>>>>>>
1195                4228                 .LSTOFF
1195                4231                 .LSTON







































        WIDGET.ASSEM            Page 135
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1195                4232                 .Page
1195                4233 ;>>>>>>>>>>>>>>>>>>>>>>>>
1195                4234 ;>
1195                4235 ;>      Procedure: Start_Command
1195                4236 ;>      Inputs   : Assumes a command string in external memory; the
1195                4237 ;>                 command byte must be in location $0000 (external )
1195                4238 ;>
1195                4239 ;>      Algorithm:
1195                4240 ;>
1195                4241 ;>      BEGIN
1195                4242 ;>       Initialize internal and external stack ptrs
1195                4243 ;>       ZeroHeader
1195                4244 ;>       Excpt_Stat.Buf_Damage := False
1195                4245 ;>       Excpt_Stat.Nzero_Stat := False
1195                4246 ;>       IF ( Cache_Index >= Cache_Length )
1195                4247 ;>        THEN Cache_Index := 0
1195                4248 ;>       OpCode := ExtMem[ 0 ]
1195                4249 ;>       IF OpCode.CommandType is FreeProcess type
1195                4250 ;>        THEN goto Strt_FreeProcess
1195                4251 ;>       IF OpCode.CommandType is protected by a checkbyte
1195                4252 ;>        THEN
1195                4253 ;>         IF NOT( Check_Command_String )
1195                4254 ;>          THEN Abort( Cmnd_Driver_Exception,
1195                4255 ;>                       Start_Command, CheckByte_Mismatch )
1195                4256 ;>       IF ( OpCode.Instruction >
1195                4257 ;>              CommandLimit[ CommandType ] )
1195                4258 ;>        THEN Abort( Cmnd_Driver_Exception
1195                4259 ;>                      Start_Command, IllegalOpCode, OpCode )
1195                4260 ;>       JMP @Command^[ CommandType ]. RoutineTable[ Instruction ]
1195                4261 ;>      END
1195                4262 ;>
1195                4263 ;>>>>>>>>>>>>>>>>>>>>>>>>
1195                4264                 .LSTOFF
1195                4267                 .LSTON

























        WIDGET.ASSEM            Page 136
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1195                4268                 .Page
1195                4269                 .FIN
1195                4270 
1195                4271 Start_Command:
1195 31 10        6 4272                 Srp     #Wrk_Sys ;get into a reasonable state
1197 B0 FE        6 4273                 Clr     Sph
1199 E6 FF 80    10 4274                 Ld      Spl,#Stack_Top
119C                4275                 
119C 2C 17        6 4276                 Ld      !r2,#.HIBYTE. StackPtr ;init external stack
119E 3C 4C        6 4277                 Ld      !r3,#.LOWBYTE. StackPtr
11A0 0C 17        6 4278                 Ld      !r0,#.HIBYTE. TopOfStack
11A2 92 02       12 4279                 Lde     @!!r2,!r0
11A4 A0 E2       10 4280                 Incw    !!r2
11A6 0C FF        6 4281                 Ld      !r0,#.LOWBYTE. TopOfStack
11A8 92 02       12 4282                 Lde     @!!r2,!r0
11AA                4283                 
11AA A6 5B 14    10 4284                 Cp      Cache_Index,#CacheLength
11AD 1B 02          4285                 Jr      Lt,St_Load_Cmnd
11AF                4286                 
11AF B0 5B        6 4287                 Clr     Cache_Index
11B1                4288                 
11B1 2C 10        6 4289 St_Load_Cmnd:    Ld     !r2,#.HIBYTE. Cmnd_Ptr
11B3 3C 1A        6 4290                  Ld     !r3,#.LOWBYTE. Cmnd_Ptr
11B5 EC 14        6 4291                  Ld     !rE,#.HIBYTE. CStatus4
11B7 FC A5        6 4292                  Ld     !rF,#.LOWBYTE. CStatus4
11B9 1C 08        6 4293                  Ld     !r1,#8 ;move 8 bytes
11BB 82 02       12 4294 St_L_Lp:        Lde     !r0,@!!r2
11BD 92 0E       12 4295                 Lde     @!!rE,!r0
11BF A0 E2       10 4296                 Incw    !!r2
11C1 A0 EE       10 4297                 Incw    !!rE
11C3 1A F6          4298                 Djnz    !r1,St_L_Lp
11C5                4299 
11C5 EC 14        6 4300 Strt_ZH:        Ld      !rE,#.HIBYTE. CStatus4
11C7 FC A5        6 4301                 Ld      !rF,#.LOWBYTE. CStatus4
11C9 82 4E       12 4302                 Lde     !r4,@!!rE
11CB                4303                 
11CB 68 E4        6 4304                 Ld      !r6,!r4
11CD 56 E6 F0    10 4305                 And     !r6,#CmndType
11D0 A6 E6 F0    10 4306                 Cp      !r6,#$F0 ;check for 'free bus command'
11D3 EB 07          4307                 Jr      Nz,Strt_ChkDiag
11D5                4308                 
11D5 2C 2D        6 4309                  Ld     !r2,#.HIBYTE. Strt_FreeProcess
11D7 3C B2        6 4310                  Ld     !r3,#.LOWBYTE. Strt_FreeProcess
11D9 D6 04 AB    20 4311                 Call    Bank_Call
11DC                4312 
11DC A6 E6 10    10 4313 Strt_ChkDiag:   Cp      !r6,#$10 ;check for diagnostic command
11DF EB 0A          4314                 Jr      Nz,Strt_Swap
11E1                4315                 
11E1 2C 29        6 4316                  Ld     !r2,#.HIBYTE. Set_SeekNeeded
11E3 3C FD        6 4317                  Ld     !r3,#.LOWBYTE. Set_SeekNeeded
11E5 D6 04 AB    20 4318                 Call    Bank_Call
11E8                4319                 
11E8 E6 57 90    10 4320                 Ld      Seek_Type,#Access_Offset
11EB F0 E6        8 4321 Strt_Swap:      Swap    !r6                     ;r6 := CommandType





        WIDGET.ASSEM            Page 137
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


11ED 6B 15          4322                 Jr      Z,Chk_Inst             ;jump if no check byte in string
11EF                4323                 
11EF 88 E4        6 4324                 Ld      !r8,!r4
11F1 56 E8 0F    10 4325                 And     !r8,#$0F ;get length of command string
11F4 A0 EE       10 4326                 Incw    !!rE ;get opcode
11F6 82 4E       12 4327                 Lde     !r4,@!!rE
11F8 EC 10        6 4328                  Ld     !rE,#.HIBYTE. Cmnd_Ptr
11FA FC 1A        6 4329                  Ld     !rF,#.LOWBYTE. Cmnd_Ptr
11FC D6 06 1D    20 4330                 Call    Chk_Chk_Byte
11FF 6B 03          4331                 Jr      Z,Chk_Inst
1201                4332                 
1201 D6 05 1F    20 4333                 Call    Abort
1204                4334                 
1204 A6 E6 02    10 4335 Chk_Inst:       Cp      !r6,#Max_Cmnd_Types     ;check for illegal type
1207 AB 1E          4336                 Jr      Gt,Inst_Abort
1209                4337 
1209 44 25 25    10 4338                 Or      SlfTst_Result,SlfTst_Result ;check if we're not healthy
120C 6B 08          4339                 Jr      Z,Chk_Limits
120E                4340                 
120E A6 E6 01    10 4341                 Cp      !r6,#01 ;only allow diagnostic commands
1211 6B 03          4342                 Jr      Z,Chk_Limits
1213                4343                 
1213 D6 05 1F    20 4344                 Call    Abort
1216                4345                 
1216 EC 12        6 4346 Chk_Limits:     Ld      !rE,#.HIBYTE. Cmnd_Limits
1218 FC 4A        6 4347                 Ld      !rF,#.LOWBYTE. Cmnd_Limits
121A 02 F6        6 4348                 Add     !rF,!r6                 ;get offset into table
121C 16 EE 00    10 4349                 Adc     !rE,#0
121F C2 0E       12 4350                 Ldc     !r0,@!!rE               ;get limit
1221 18 E4        6 4351                 Ld      !r1,!r4                 ;get instruction
1223 A2 10        6 4352                 Cp      !r1,!r0
1225 2B 03          4353                 Jr      Le,Ok_Inst              ;jump if legal instruction
1227                4354 
1227 D6 05 1F    20 4355 Inst_Abort:     Call    Abort
122A                4356                 
122A EC 12        6 4357 Ok_Inst:        Ld      !rE,#.HIBYTE. Cmnd_Ptrs
122C FC 4D        6 4358                 Ld      !rF,#.LOWBYTE. Cmnd_Ptrs
122E 90 E6        6 4359                 Rl      !r6
1230 02 F6        6 4360                 Add     !rF,!r6                 ;get offset into table
1232 16 EE 00    10 4361                 Adc     !rE,#0
1235 C2 CE       12 4362                 Ldc     !rC,@!!rE               ;get inst routine ptr
1237 A0 EE       10 4363                 Incw    !!rE
1239 C2 DE       12 4364                 Ldc     !rD,@!!rE
123B 90 E1        6 4365                 Rl      !r1
123D 02 D1        6 4366                 Add     !rD,!r1                 ;get offset into table
123F 16 EC 00    10 4367                 Adc     !rC,#0
1242 C2 EC       12 4368                 Ldc     !rE,@!!rC               ;get address to routine
1244 A0 EC       10 4369                 Incw    !!rC
1246 C2 FC       12 4370                 Ldc     !rF,@!!rC
1248 30 EE        8 4371                 Jp      @!rE                    ;jump to routine
124A                4372 








        WIDGET.ASSEM            Page 138
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


124A                4373                 .Page
124A                4374 
124A                4375 ;>>>>>>>>>>>>>>>>>>>>>>>>
124A                4376 ;>
124A                4377 ;>      Command Routine Tables
124A                4378 ;>
124A                4379 ;>>>>>>>>>>>>>>>>>>>>>>>>
124A                4380 
124A 02             4381 Cmnd_Limits:    .DB     Pro_Cmnds
124B 13             4382                 .DB     Diag_Cmnds
124C 02             4383                 .DB     Sys_Cmnds
124D                4384 
124D 12 53          4385 Cmnd_Ptrs:      .DW     Pro_Inst
124F 12 59          4386                 .DW     Diag_Inst
1251 12 81          4387                 .DW     Sys_Inst
1253                4388 
1253 12 87          4389 Pro_Inst:       .DW     Pro_Read
1255 18 86          4390                 .DW     Pro_Write
1257 19 4E          4391                 .DW     Pro_WrVer
1259                4392                 
1259 18 24          4393 Diag_Inst:      .DW     D_Read_ID               ;cmnd 0
125B 1A 33          4394                 .DW     Read_CStatus            ;cmnd 1
125D 1A BF          4395                 .DW     Read_SStatus            ;cmnd 2
125F 1B 03          4396                 .DW     Send_ServoCmnd          ;cmnd 3
1261 1B 2E          4397                 .DW     Send_Seek               ;cmnd 4
1263 1B 52          4398                 .DW     Send_Restore            ;cmnd 5
1265 1B 75          4399                 .DW     Set_Recovery            ;cmnd 6
1267 00 0C          4400                 .DW     $000C ;Soft_Reset       ;cmnd 7
1269 1B 8E          4401                 .DW     Send_Park               ;cmnd 8
126B 19 A5          4402                 .DW     D_Read                  ;cmnd 9
126D 19 C1          4403                 .DW     D_ReadHdr               ;cmnd A
126F 1A 17          4404                 .DW     D_Write                 ;cmnd B
1271 1B A1          4405                 .DW     Store_Map               ;cmnd C
1273 18 73          4406                 .DW     D_Read_SprTbl           ;cmnd D
1275 1B D2          4407                 .DW     Wr_SprTbl               ;cmnd E  + password
1277 1B FE          4408                 .DW     Format                  ;cmnd F  + password
1279 1C 72          4409                 .DW     D_InitSprTbl            ;cmnd 10 + password
127B 1C 3F          4410                 .DW     Read_Abort              ;cmnd 11
127D 1C 5F          4411                 .DW     D_RstSrvo               ;cmnd 12
127F 10 59          4412                 .DW     Scan_Vector             ;cmnd 13
1281                4413                 
1281 1C 9E          4414 Sys_Inst:       .DW     Sys_Read
1283 1D 72          4415                 .DW     Sys_Write
1285 19 49          4416                 .DW     Sys_WrV
1287                4417 
1287                4418                 .LSTOFF
1287                4420                 .LSTON












        WIDGET.ASSEM            Page 139
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1287                4421                 .Page
1287                4422 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1287                4423 ;>
1287                4424 ;>      Procedure: Pro_Read     { Profile Read }
1287                4425 ;>
1287                4426 ;>      This procedure emulates a Profile read operation.
1287                4427 ;>
1287                4428 ;>      Inputs: { none }
1287                4429 ;>
1287                4430 ;>      Outputs: { none }
1287                4431 ;>
1287                4432 ;>      Local Variables:
1287                4433 ;>              BlockStatus : BYTE { !r4 }
1287                4434 ;>              BlockNumber : 3 BYTES { !rC:E }
1287                4435 ;>
1287                4436 ;>      Global Variables Changed:
1287                4437 ;>              LogicalBlockNumber
1287                4438 ;>
1287                4439 ;>      Algorithm:
1287                4440 ;>
1287                4441 ;>      BEGIN
1287                4442 ;>       ClearStatus
1287                4443 ;>       LogicalBlockNumber := Command.LogicalBlockNumber
1287                4444 ;>       Ack_Read( Pro_Read_Response )
1287                4445 ;>       BlockType, BlockNumber := Get_Type( Profile )
1287                4446 ;>       Seek_Type := Access { Seek without Auto-Offset }
1287                4447 ;>       SearchStatus, Element.Ptr := OverLappedSeek( Read, BlockType,
1287                4448 ;>                                                    BlockNumber, 0 )
1287                4449 ;>       IF NOT( Read_Common )
1287                4450 ;>        THEN Data_Ex_Handler( Read_Common.ErrorType )
1287                4451 ;>        ELSE
1287                4452 ;>         IF ( BlkStat.SprCode = Bad_Block )
1287                4453 ;>          THEN
1287                4454 ;>              BlockMove( Buf2Array, RDummy )
1287                4455 ;>              Data_Ex_Handler( SpareBlock )
1287                4456 ;>       Move4( StatusArray, Status )
1287                4457 ;>       Clr_Bsy( StatusArray )
1287                4458 ;>      END
1287                4459 ;>
1287                4460 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1287                4461                 .LSTOFF
1287                4464                 .LSTON

















        WIDGET.ASSEM            Page 140
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1287                4465                 .Page
1287                4466                 .FIN
1287                4467 
1287                4468 Pro_Read:
1287 E6 0A 02    10 4469                  Ld     Wrk_Io+$A,#Read_Response
128A D6 03 02    20 4470                 Call    Ack_Read
128D                4471                 
128D D6 1E 89    20 4472                 Call    ClrNormStat
1290                4473                 
1290 0C 01        6 4474                  Ld     !r0,#Pro_Log_Offset
1292 D6 06 4E    20 4475                 Call    Ld_LgclBlk;LogicalBlockNumber := ...
1295                4476                 
1295 8C 00        6 4477                  Ld     !r8,#Profile
1297 2C 21        6 4478                  Ld     !r2,#.HIBYTE. Get_Type
1299 3C A1        6 4479                  Ld     !r3,#.LOWBYTE. Get_Type
129B D6 04 AB    20 4480                 Call    Bank_Call
129E                4481                 
129E A6 E8 08    10 4482                 Cp      !r8,#SprTbl_Type
12A1 6D 18 7C       4483                 Jp      Z,Read_SprTbl
12A4 A6 E8 04    10 4484                 Cp      !r8,#ID_Type
12A7 6D 18 2D       4485                 Jp      Z,Read_ID
12AA                4486                 
12AA E6 57 80    10 4487                 Ld      Seek_Type,#Access
12AD E6 58 02    10 4488                 Ld      Data_Type,#User_Type
12B0 56 56 D7    10 4489                 And     DiskStat,#$FF-Wr_Op-Seq_CachSrch
12B3                4490                 
12B3 2C 26        6 4491                  Ld     !r2,#.HIBYTE. OverLap
12B5 3C 06        6 4492                  Ld     !r3,#.LOWBYTE. OverLap
12B7 D6 04 AB    20 4493                 Call    Bank_Call
12BA                4494                 
12BA D6 12 F2    20 4495                 Call    Read_Common
12BD 6B 08          4496 Pro_Rd_Exit:    Jr      Z,ProRd_Err
12BF                4497                 
12BF 76 5A 02    10 4498                 Tm      BlkStat,#B_Block ;check if block read was a bad block
12C2 6B 06          4499                 Jr      Z,Rd_Leave
12C4                4500                 
12C4 D6 12 DB    20 4501                 Call    Pro_Rd_BB
12C7 D6 16 BD    20 4502 ProRd_Err:      Call    Data_Ex_Handler
12CA                4503                 
12CA E6 0A 01    10 4504 Rd_Leave:       Ld      Wrk_Io+$A,#Init_Response
12CD B0 0B        6 4505                 Clr     Wrk_Io+$B ;Cmnd_Pending, IBsy := False
12CF                4506                 
12CF D6 12 E6    20 4507 Rd_Leave2:      Call    Ld_Stand_Stat
12D2                4508 
12D2 E6 0C 10    10 4509 Rd_Leave1:       Ld     Wrk_Io+$C,#.HIBYTE. StatusArray
12D5 E6 0D 15    10 4510                  Ld     Wrk_Io+$D,#.LOWBYTE. StatusArray
12D8 8D 02 5F       4511                 Jp      Clr_Bsy
12DB                4512 
12DB 2C 20        6 4513 Pro_Rd_BB:       Ld     !r2,#.HIBYTE. RBuf_To_Buf2
12DD 3C 8F        6 4514                  Ld     !r3,#.LOWBYTE. RBuf_To_Buf2
12DF D6 04 AB    20 4515                 Call    Bank_Call
12E2 D6 13 41    20 4516                 Call    Rd_SprBlock
12E5 AF          14 4517                 Ret
12E6                4518                 





        WIDGET.ASSEM            Page 141
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


12E6                4519                 
12E6                4520 ;****************
12E6 2C 14        6 4521 Ld_Stand_Stat:   Ld     !r2,#.HIBYTE. CStatus0
12E8 3C 95        6 4522                  Ld     !r3,#.LOWBYTE. CStatus0
12EA EC 10        6 4523                  Ld     !rE,#.HIBYTE. StatusArray
12EC FC 15        6 4524                  Ld     !rF,#.LOWBYTE. StatusArray
12EE D6 1E BD    20 4525                 Call    Move4_B0
12F1 AF          14 4526                 Ret
12F2                4527                 
12F2                4528                 .LSTOFF
12F2                4530                 .LSTON
















































        WIDGET.ASSEM            Page 142
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


12F2                4531                 .Page
12F2                4532 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
12F2                4533 ;>
12F2                4534 ;>      Function: Read_Common
12F2                4535 ;>
12F2                4536 ;>      This procedure is responsible for all the common functions
12F2                4537 ;>      performed by all the read commands.
12F2                4538 ;>
12F2                4539 ;>      Inputs: { none }
12F2                4540 ;>
12F2                4541 ;>      Outputs:
12F2                4542 ;>              Read_Common : BOOLEAN { zero flag, true if data exception }
12F2                4543 ;>              ErrorCode.Error   : BOOLEAN { !r0/Bit 7 }
12F2                4544 ;>              ErrorCode.Type    : 7 BITS { !r0/Bits 6:0 }
12F2                4545 ;>
12F2                4546 ;>      Local Variables:
12F2                4547 ;>              Retry        : BYTE { !r5 }
12F2                4548 ;>              ErrorCode    : BYTE { !r4 }
12F2                4549 ;>
12F2                4550 ;>      Algorithm:
12F2                4551 ;>
12F2                4552 ;>      BEGIN
12F2                4553 ;>       ErrorCode.Error := False
12F2                4554 ;>       IF NOT( ReadBlock )
12F2                4555 ;>        THEN
12F2                4556 ;>         ErrorCode.Error := True
12F2                4557 ;>         ErrorCode.Type := Undetermined
12F2                4558 ;>         IF Recovery
12F2                4559 ;>            THEN
12F2                4560 ;>                IF ServoError OR NoHeaderFound
12F2                4561 ;>                 THEN
12F2                4562 ;>                   ErrorCode.Error := False
12F2                4563 ;>                   Retry := 4
12F2                4564 ;>                   REPEAT
12F2                4565 ;>                     THEN
12F2                4566 ;>                           ServoRecovery
12F2                4567 ;>                           Retry := Retry - 1
12F2                4568 ;>                   UNTIL NOT( Retry = 0 ) OR ReadBlock
12F2                4569 ;>                  IF NOT( ReadBlock )
12F2                4570 ;>                   THEN
12F2                4571 ;>                       ErrorCode.Error := True
12F2                4572 ;>                       ErrorCode.Type := Undetermined
12F2                4573 ;>                  IF ServoError
12F2                4574 ;>                   THEN
12F2                4575 ;>                        SetStatus( Byte0, Status_ServoError )
12F2                4576 ;>                        Abort
12F2                4577 ;>                  IF NoHeaderFound
12F2                4578 ;>                   THEN ErrorCode.Type := BadBlock
12F2                4579 ;>                   ELSE
12F2                4580 ;>                    IF ( ErrCnt > 0 )
12F2                4581 ;>                     THEN
12F2                4582 ;>                          IF ( ReadErrorCount > 2 ) AND
12F2                4583 ;>                                    ( ReadErrorCount < 10 )
12F2                4584 ;>                           THEN ErrorType := SpareBlock





        WIDGET.ASSEM            Page 143
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


12F2                4585 ;>                           ELSE
12F2                4586 ;>                                  IF ( ReadErrorCount = 10 )
12F2                4587 ;>                                   THEN
12F2                4588 ;>                                    IF Ecc
12F2                4589 ;>                                     THEN ErrorCode.Type := SpareBlock
12F2                4590 ;>                                     ELSE ErrorCode.Type := BadBlock
12F2                4591 ;>                     ELSE ErrorCode.Type := ReadError
12F2                4592 ;>       Read_Common := NOT( ErrorCode.Error )
12F2                4593 ;>      END
12F2                4594 ;>
12F2                4595 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
12F2                4596                 .LSTOFF
12F2                4599                 .LSTON














































        WIDGET.ASSEM            Page 144
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


12F2                4600                 .Page
12F2                4601                 .FIN
12F2                4602 
12F2                4603 Read_Common:
12F2 56 56 DF    10 4604                 And     DiskStat,#$FF-Wr_Op
12F5 B0 E4        6 4605                 Clr     !r4
12F7 D6 1E CC    20 4606                 Call    ReadBlock
12FA EB 4F          4607                 Jr      Nz,Rd_Cmn_End
12FC                4608                 
12FC 4C 80        6 4609                 Ld      !r4,#RdError ;ErrorCode := Error, Undetermined
12FE                4610                 
12FE 76 24 80    10 4611                 Tm      Excpt_Stat,#Recovery ;IF Recovery THEN ...
1301 6B 48          4612                 Jr      Z,Rd_Cmn_End
1303                4613                 
1303 5C 04        6 4614                 Ld      !r5,#4  ;Retry := 4
1305                4615                 
1305 76 26 50    10 4616 Rd_Cmn_Lp:      Tm      RdStat,#RdSrvoErr + RdNoHdrFnd
1308 6B 28          4617                 Jr      Z,Rd_Cmn_Crct
130A                4618                 
130A 2C 29        6 4619                  Ld     !r2,#.HIBYTE. SrvoRcvry
130C 3C 0C        6 4620                  Ld     !r3,#.LOWBYTE. SrvoRcvry
130E D6 04 AB    20 4621                 Call    Bank_Call
1311                4622                 
1311 D6 1E CC    20 4623                 Call    ReadBlock
1314 B0 E4        6 4624                 Clr     !r4
1316 EB 33          4625                 Jr      Nz,Rd_Cmn_End
1318                4626                 
1318 5A EB          4627                 Djnz    !r5,Rd_Cmn_Lp
131A                4628                 
131A 76 26 40    10 4629 Rd_Cmn_Servo:   Tm      RdStat,#RdSrvoErr
131D 6B 0A          4630                 Jr      Z,Rd_Cmn_Hdr
131F                4631                 
131F B0 E0        6 4632                  Clr    !r0 ;Byte 0
1321 1C 02        6 4633                  Ld     !r1,#Stat_Srvo
1323 D6 04 03    20 4634                 Call    SetStatus
1326 D6 05 1F    20 4635                 Call    Abort
1329                4636                 
1329 76 26 10    10 4637 Rd_Cmn_Hdr:     Tm      RdStat,#RdNoHdrFnd
132C 6B 04          4638                 Jr      Z,Rd_Cmn_Crct
132E                4639                 
132E 4C 88        6 4640                 Ld      !r4,#Error+Ex_HdrBad
1330 8B 19          4641                 Jr      Rd_Cmn_End
1332                4642                  
1332 08 27        6 4643 Rd_Cmn_Crct:    Ld      !r0,RdErrCnt
1334 56 E0 0F    10 4644                 And     !r0,#$0F ;mask off unwanted status
1337 A6 E0 03    10 4645                 Cp      !r0,#SprThresh
133A 2B 09          4646                 Jr      Le,Rd_Cmn_RdErr
133C A6 E0 0A    10 4647                 Cp      !r0,#10
133F 6B 08          4648                 Jr      Z,Rd_BadBlock
1341                4649                 
1341 4C 82        6 4650 Rd_SprBlock:    Ld      !r4,#Error+Ex_SprBlock
1343 8B 06          4651                 Jr      Rd_Cmn_End
1345                4652                 
1345 4C 86        6 4653 Rd_Cmn_RdErr:   Ld      !r4,#Error+Ex_ReadErr





        WIDGET.ASSEM            Page 145
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1347 8B 02          4654                 Jr      Rd_Cmn_End
1349                4655                 
1349 4C 84        6 4656 Rd_BadBlock:    Ld      !r4,#Error+Ex_BadBlock
134B                4657                 
134B 08 E4        6 4658 Rd_Cmn_End:     Ld      !r0,!r4
134D 66 E0 80    10 4659                 Tcm     !r0,#RdError
1350 8D 04 F8       4660                 Jp      Bank_Ret
1353                4661                 
1353                4662                 .LSTOFF
1353                4667                 .LSTON

















































        WIDGET.ASSEM            Page 146
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1353                4668                 .Page
1353                4669 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1353                4670 ;>
1353                4671 ;>      Module: Spare
1353                4672 ;>
1353                4673 ;>      This module contains all the routines that pertain 
1353                4674 ;>      to the management of the spare table.
1353                4675 ;>
1353                4676 ;>      PROCEDURE SprBlock( SpareType : BIT { !r8/bit 7 } )
1353                4677 ;>      PROCEDURE SpareBlock( BlockIsSpare : BOOLEAN { !r8/bit 4 } )
1353                4678 ;>
1353                4679 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1353                4680                 .LSTOFF
1353                4683                 .LSTON













































        WIDGET.ASSEM            Page 147
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1353                4684                 .Page
1353                4685 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1353                4686 ;>
1353                4687 ;>      Procedure: SprBlock     { Spare A Block }
1353                4688 ;>
1353                4689 ;>      This procedure is responsible for relocating a logical
1353                4690 ;>      block { note that the block type can be USER, or SPARETABLE }
1353                4691 ;>      from either the user data area OR the spare area to
1353                4692 ;>      some location within the spare area.
1353                4693 ;>
1353                4694 ;>      This procedure is capable of gobbling up ALL available spare
1353                4695 ;>      block space and will ABORT if no space is available.
1353                4696 ;>
1353                4697 ;>      Inputs:
1353                4698 ;>              SpareType : BIT { !rA/bit 4 }
1353                4699 ;>
1353                4700 ;>      Outputs: { none }
1353                4701 ;>
1353                4702 ;>      Algorithm:
1353                4703 ;>
1353                4704 ;>      BEGIN
1353                4705 ;>       IF ( SpareType = Spare )
1353                4706 ;>        THEN
1353                4707 ;>         IF ( BlkStat.SpareCode = BadBlock )
1353                4708 ;>          THEN 
1353                4709 ;>              DeleteSpare
1353                4710 ;>              SpareCount( Dec_BadCnt )
1353                4711 ;>         BlockMove( WBuffer1, Buffer2 )
1353                4712 ;>         IF NOT( WrVer_Common )
1353                4713 ;>          THEN
1353                4714 ;>           SpareBlock( SpareType )
1353                4715 ;>        ELSE SpareBlock( BadBlockType )
1353                4716 ;>       UpDate_SprTbl
1353                4717 ;>       BlockMove( Buffer2, RBuffer1 )
1353                4718 ;>      END
1353                4719 ;>
1353                4720 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1353                4721                 .LSTOFF
1353                4724                 .LSTON




















        WIDGET.ASSEM            Page 148
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1353                4725                 .Page
1353                4726                 .FIN
1353                4727 
1353                4728 SprBlock:
1353 70 52          4729                 Push    Cylinder ;save current seek address
1355 70 53          4730                 Push    Cylinder+1
1357 70 54          4731                 Push    Head
1359 70 55          4732                 Push    Sector
135B                4733                 
135B 76 EA 10    10 4734                 Tm      !rA,#Spare ;IF SpareType = Spare
135E 6B 3D          4735                 Jr      Z,SprBlk_1
1360                4736                 
1360 D6 18 1E    20 4737                 Call    Get_Spr_Code
1363 A6 E0 02    10 4738                 Cp      !r0,#B_Block
1366 EB 0C          4739                 Jr      Nz,SprBlk_2
1368                4740                 
1368 D6 15 B7    20 4741                 Call    DeleteSpare
136B 0C 02        6 4742                  Ld     !r0,#Dec_BadCnt
136D 2C 25        6 4743                  Ld     !r2,#.HIBYTE. SpareCount
136F 3C 1A        6 4744                  Ld     !r3,#.LOWBYTE. SpareCount
1371 D6 04 AB    20 4745                 Call    Bank_Call
1374                4746                 
1374 D6 05 CA    20 4747 SprBlk_2:       Call    ReSeek
1377 4C 0A        6 4748                 Ld      !r4,#10 ;bang on this block for a while
1379 5C 00        6 4749                 Ld      !r5,#0 ;init error count
137B                4750 
137B 2C 20        6 4751 Spr_WrVer:       Ld     !r2,#.HIBYTE. Buf2_To_WrBuf
137D 3C 6B        6 4752                  Ld     !r3,#.LOWBYTE. Buf2_To_WrBuf
137F D6 04 AB    20 4753                 Call    Bank_Call
1382                4754 
1382 E6 27 0A    10 4755                  Ld     RdErrCnt,#10 ;assume failure
1385 D6 19 70    20 4756                 Call    WrVer_Common
1388 EB 0C          4757                 Jr      Nz,SprWrV_1
138A                4758                 
138A 08 27        6 4759                 Ld      !r0,RdErrCnt
138C 56 E0 0F    10 4760                 And     !r0,#$0F ;mask off status info
138F A6 E0 03    10 4761                 Cp      !r0,#SprThresh
1392 AB 09          4762                 Jr      Gt,SprBlk_1 ;spare the block
1394                4763                 
1394 02 50        6 4764                 Add     !r5,!r0 ;bump cumulative error count
1396 4A E3          4765 SprWrV_1:       Djnz    !r4,Spr_WrVer
1398                4766                 
1398 A6 E5 03    10 4767                 Cp      !r5,#SprThresh ;take a percentage of total reads
139B 2B 03          4768                 Jr      Le,SprBlk_3
139D                4769                 
139D D6 13 BA    20 4770 SprBlk_1:       Call    SpareBlock
13A0                4771                 
13A0 2C 24        6 4772 SprBlk_3:        Ld     !r2,#.HIBYTE. UpDate_SprTbl
13A2 3C 51        6 4773                  Ld     !r3,#.LOWBYTE. UpDate_SprTbl
13A4 D6 04 AB    20 4774                 Call    Bank_Call
13A7 2C 20        6 4775                  Ld     !r2,#.HIBYTE. Buf2_To_RBuf
13A9 3C 5B        6 4776                  Ld     !r3,#.LOWBYTE. Buf2_To_RBuf
13AB D6 04 AB    20 4777                 Call    Bank_Call
13AE                4778 





        WIDGET.ASSEM            Page 149
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


13AE 50 EF       10 4779 SprBlk_Ret:     Pop     !rF ;retrieve current seek address 
13B0 50 EE       10 4780                 Pop     !rE ;head
13B2 50 ED       10 4781                 Pop     !rD ;lo-cyl
13B4 50 EC       10 4782                 Pop     !rC ;hi-cyl
13B6 D6 10 8D    20 4783                 Call    Seek_Vector ;put us back where we were!
13B9 AF          14 4784                 Ret
13BA                4785                 
13BA                4786                 .LSTOFF
13BA                4788                 .LSTON


















































        WIDGET.ASSEM            Page 150
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


13BA                4789                 .Page
13BA                4790 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
13BA                4791 ;>
13BA                4792 ;>      Procedure: SpareBlock
13BA                4793 ;>
13BA                4794 ;>      This function performs the actual sparing.
13BA                4795 ;>
13BA                4796 ;>      Inputs:
13BA                4797 ;>              SpareType          : BIT { !rA/bit 4 }
13BA                4798 ;>
13BA                4799 ;>      Outputs: { none }
13BA                4800 ;>
13BA                4801 ;>      Local Variables:
13BA                4802 ;>              SparingASpare : BOOLEAN { !r9 }
13BA                4803 ;>              SpareLocation : BYTE { !r4 }
13BA                4804 ;>              Error         : BOOLEAN { !r5 }
13BA                4805 ;>
13BA                4806 ;>      Algorithm:
13BA                4807 ;>
13BA                4808 ;>      BEGIN
13BA                4809 ;>       IF ( BlkStat.SpareCode = BadBlock )
13BA                4810 ;>        THEN 
13BA                4811 ;>              AddSpare( GetNewSpare( Load_Logical ), Load_Logical, BadBlock )
13BA                4812 ;>              SpareCount( Inc_BadCnt )
13BA                4813 ;>        ELSE
13BA                4814 ;>             REPEAT
13BA                4815 ;>              IF ( BlkStat.SpareCode = Spare )
13BA                4816 ;>               THEN
13BA                4817 ;>                Location := SrchSpTabl( Load_Logical )
13BA                4818 ;>                Ptr := Get_Ptr( Location )
13BA                4819 ;>                Ptr^.Useable := False
13BA                4820 ;>              SpareCount( Inc_SprCnt )
13BA                4821 ;>              BlkStat.SpareCode := SpareBlock
13BA                4822 ;>              Location := GetNewSpare( Load_Logical )
13BA                4823 ;>              AddSpare( Location, Load_Logical, SpareBlock )
13BA                4824 ;>              Seek_Type := Access_Offset
13BA                4825 ;>              Seek( Get_Cyl_H_S( MulR0_m( Location ) ) )
13BA                4826 ;>             UNTIL WrVer_Common
13BA                4827 ;>      END
13BA                4828 ;>
13BA                4829 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
13BA                4830                 .LSTOFF
13BA                4833                 .LSTON
















        WIDGET.ASSEM            Page 151
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


13BA                4834                 .Page
13BA                4835                 .FIN
13BA                4836                 
13BA                4837 SpareBlock:
13BA 0C 01        6 4838                  Ld     !r0,#1 ;byte 1
13BC 1C 04        6 4839                  Ld     !r1,#Stat_Spare
13BE D6 04 03    20 4840                 Call    SetStatus
13C1                4841                 
13C1 76 EA 10    10 4842                 Tm      !rA,#Spare
13C4 EB 20          4843                 Jr      Nz,S_Blk_Rpt
13C6                4844                 
13C6 D6 18 1E    20 4845                 Call    Get_Spr_Code
13C9 A6 E0 02    10 4846                 Cp      !r0,#B_Block
13CC 6B 25          4847                 Jr      Z,S_Blk_End
13CE                4848                 
13CE D6 06 0D    20 4849                 Call    Load_Logical
13D1 D6 15 07    20 4850                 Call    GetNewSpare
13D4 F8 E0        6 4851                  Ld     !rF,!r0
13D6 8C 00        6 4852                  Ld     !r8,#BadBlock
13D8 D6 15 74    20 4853                 Call    AddSpare
13DB 0C 01        6 4854                  Ld     !r0,#Inc_BadCnt
13DD 2C 25        6 4855                  Ld     !r2,#.HIBYTE. SpareCount
13DF 3C 1A        6 4856                  Ld     !r3,#.LOWBYTE. SpareCount
13E1 D6 04 AB    20 4857                 Call    Bank_Call
13E4 8B 0D          4858                 Jr      S_Blk_End
13E6                4859                 
13E6 D6 06 0D    20 4860 S_Blk_Rpt:      Call    Load_Logical
13E9 D6 13 F6    20 4861                 Call    Spr_Enter
13EC EB 05          4862                 Jr      Nz,S_Blk_End
13EE                4863                 
13EE A6 E0 86    10 4864                 Cp      !r0,#Error+Ex_ReadErr ;check for sparing threshold
13F1 EB F3          4865                 Jr      Nz,S_Blk_Rpt
13F3                4866                 
13F3 8D 04 F8       4867 S_Blk_End:      Jp      Bank_Ret
13F6                4868 
























        WIDGET.ASSEM            Page 152
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


13F6                4869                 .Page
13F6                4870 
13F6 D6 18 1E    20 4871 Spr_Enter:      Call    Get_Spr_Code
13F9 A6 E0 01    10 4872                  Cp     !r0,#S_Block
13FC EB 22          4873                 Jr      Nz,S_Blk_New
13FE                4874                 
13FE D6 10 97    20 4875                 Call    ExtPush_Vector
1401 D6 14 7A    20 4876                 Call    SrchSpTabl
1404 70 E1          4877                  Push   !r1             ;save possible ptr to element
1406 70 FC          4878                  Push   Flags
1408 D6 10 9F    20 4879                  Call   ExtPop_Vector
140B 50 FC       10 4880                  Pop    Flags
140D 50 E1       10 4881                  Pop    !r1
140F EB 03          4882                 Jr      Nz,S_Blk_Unuse
1411                4883                 
1411 D6 05 1F    20 4884                 Call    Abort
1414                4885                 
1414 08 E1        6 4886 S_Blk_Unuse:     Ld     !r0,!r1
1416 D6 18 04    20 4887                 Call    Get_Ptr
1419 82 02       12 4888                 Lde     !r0,@!!r2 ;Element.Useable := False
141B 56 E0 DF    10 4889                 And     !r0,#$FF-Useable
141E 92 02       12 4890                 Lde     @!!r2,!r0
1420                4891 
1420 0C 00        6 4892 S_Blk_New:       Ld     !r0,#Inc_SprCnt
1422 2C 25        6 4893                  Ld     !r2,#.HIBYTE. SpareCount
1424 3C 1A        6 4894                  Ld     !r3,#.LOWBYTE. SpareCount
1426 D6 04 AB    20 4895                 Call    Bank_Call
1429                4896                 
1429 56 5A FC    10 4897                 And     BlkStat,#$FC ;mask out the SpareCode stuff
142C 46 5A 01    10 4898                 Or      BlkStat,#S_Block
142F                4899                 
142F D6 15 07    20 4900                 Call    GetNewSpare
1432 F8 E0        6 4901                  Ld     !rF,!r0
1434 8C 10        6 4902                  Ld     !r8,#Spare
1436 D6 15 74    20 4903                 Call    AddSpare
1439                4904                 
1439 E6 57 90    10 4905                 Ld      Seek_Type,#Access_Offset
143C                4906                  
143C 08 EF        6 4907                  Ld     !r0,!rF ;get Location back
143E 0E           6 4908                  Inc    !r0 ;count 1..76
143F 2C 25        6 4909                  Ld     !r2,#.HIBYTE. MulR0_m
1441 3C CC        6 4910                  Ld     !r3,#.LOWBYTE. MulR0_m
1443 D6 04 AB    20 4911                 Call    Bank_Call
1446 2C 20        6 4912                  Ld     !r2,#.HIBYTE. Get_Cyl_H_S
1448 3C DA        6 4913                  Ld     !r3,#.LOWBYTE. Get_Cyl_H_S
144A D6 04 AB    20 4914                 Call    Bank_Call
144D 08 EF        6 4915                  Ld     !r0,!rF
144F 2C 25        6 4916                  Ld     !r2,#.HIBYTE. ReMap_Sector
1451 3C F0        6 4917                  Ld     !r3,#.LOWBYTE. ReMap_Sector
1453 D6 04 AB    20 4918                 Call    Bank_Call
1456 F8 E0        6 4919                  Ld     !rF,!r0
1458 D6 10 8D    20 4920                 Call    Seek_Vector
145B                4921                 
145B A6 58 02    10 4922                 Cp      DataType,#User_type





        WIDGET.ASSEM            Page 153
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


145E 6B 0D          4923                 Jr      Z,Spr_LdBuf2
1460                4924                 
1460 2C 23        6 4925                  Ld     !r2,#.HIBYTE. SprChkSum ;calculate new checkbyte
1462 3C F5        6 4926                  Ld     !r3,#.LOWBYTE. SprChkSum
1464 D6 04 AB    20 4927                 Call    Bank_Call
1467 2C 20        6 4928                  Ld     !r2,#.HIBYTE. Spr_To_WrBuf
1469 3C A2        6 4929                  Ld     !r3,#.LOWBYTE. Spr_To_WrBuf
146B 8B 04          4930                 Jr      Spr_LdWrBuf
146D                4931                 
146D 2C 20        6 4932 Spr_LdBuf2:      Ld     !r2,#.HIBYTE. Buf2_To_WrBuf
146F 3C 6B        6 4933                  Ld     !r3,#.LOWBYTE. Buf2_To_WrBuf
1471 D6 04 AB    20 4934 Spr_LdWrBuf:    Call    Bank_Call
1474                4935                 
1474 D6 19 70    20 4936                 Call    WrVer_Common
1477 8D 04 F8       4937                 Jp      Bank_Ret
147A                4938                 
147A                4939                 .LSTOFF
147A                4944                 .LSTON









































        WIDGET.ASSEM            Page 154
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


147A                4945                 .Page
147A                4946 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
147A                4947 ;>
147A                4948 ;>      Module: Spare1  { a continuation of Spare }
147A                4949 ;>
147A                4950 ;>      FUNCTION SrchSpTabl( LogicalBlock : 3 BYTES { !rC:E }
147A                4951 ;>                           BlockType : 3 BITS { !r8/bits 3:1 } ) :
147A                4952 ;>                         PhysicalBlock : 3 BYTES { !rC:E }
147A                4953 ;>                         Status : BYTE { !r0 }
147A                4954 ;>                         ElementPtr : BYTE { !r1 }
147A                4955 ;>      FUNCTION GetNewSpare( BlockNumber : 3 BYTES { !rC:E } ) : BYTE { !r0 }
147A                4956 ;>      PROCEDURE AddSpare( BlockType : 3 BITS { !r8/bits 3:1 }
147A                4957 ;>                          SpareType : BIT { !r8/bit 4 }
147A                4958 ;>                          Location  : BYTE { !rF }
147A                4959 ;>                          LogicalBlock : 3 BYTES { !rC:E }
147A                4960 ;>                        )
147A                4961 ;>      PROCEDURE DeleteSpare( Location : BYTE { !rF }
147A                4962 ;>                             LogicalBlock : 3 BYTES { !rC:E }
147A                4963 ;>                           )
147A                4964 ;>
147A                4965 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
147A                4966                 .LSTOFF
147A                4969                 .LSTON




































        WIDGET.ASSEM            Page 155
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


147A                4970                 .Page
147A                4971 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
147A                4972 ;>
147A                4973 ;>      Function: SrchSpTabl  { Search Spare Table }
147A                4974 ;>
147A                4975 ;>      This function is responsible for checking to see if the
147A                4976 ;>      block number that is passed into it is currently in the
147A                4977 ;>      spare table. If the block is found to be in the spare table
147A                4978 ;>      then the physical block number of the spare block is passed
147A                4979 ;>      back to the caller, as well as the PTR to the location of
147A                4980 ;>      spared block's element within the spare table. In any case,
147A                4981 ;>      a byte of status is always passed back to the caller describing
147A                4982 ;>      the state of the logical block within the spare table.
147A                4983 ;>
147A                4984 ;>      Inputs:
147A                4985 ;>              LogicalBlockNumber: 3 BYTES { !rC, !rD, !rE }
147A                4986 ;>              ElementType       : BYTE { !rF }
147A                4987 ;>
147A                4988 ;>      Outputs:
147A                4989 ;>              SrchSpTabl : BOOLEAN { zero flag set if not found in table }
147A                4990 ;>              PhysicalBlockNumber: 3 BYTES { !rC, !rD, !rE }
147A                4991 ;>              Status             : 1 BYTE { !r0 }
147A                4992 ;>              ElementPtr         : 1 BYTE { !r1 }
147A                4993 ;>
147A                4994 ;>      Local Variables:
147A                4995 ;>              HeadPtr : 1 BYTE { !r0 }
147A                4996 ;>              Ptr     : 1 BYTE { !r0, offset; !!r8, actual Ptr }
147A                4997 ;>              Found   : 1 BYTE { !r7 }
147A                4998 ;>
147A                4999 ;>      Algorithm:
147A                5000 ;>
147A                5001 ;>      BEGIN
147A                5002 ;>       CASE DiskCapacity OF
147A                5003 ;>        10MB: k := 256; m := 256
147A                5004 ;>        20MB: k := 128; m := 512
147A                5005 ;>        40MB: k := 64;  m := 1024
147A                5006 ;>       HeadPtr :=  Get_HeadPtr
147A                5007 ;>       IF HeadPtr.Nil
147A                5008 ;>        THEN PhysicalBlockNumber := LogicalBlockNumber +
147A                5009 ;>                                      LogicalBlockNumber DIV k
147A                5010 ;>        ELSE
147A                5011 ;>              Ptr := HeadPtr.Ptr
147A                5012 ;>              Ptr := Ptr * 4  { calc offset into spare table }
147A                5013 ;>              Done := False
147A                5014 ;>              Found := False
147A                5015 ;>              WHILE NOT( Done ) DO
147A                5016 ;>               IF ( Ptr^.Used ) AND ( Ptr^.Useable ) AND
147A                5017 ;>                      ( Ptr^.Type = ElementType ) AND
147A                5018 ;>                      ( Ptr^.Token = LogicalBlockNumber/bits 0:9 )
147A                5019 ;>                THEN 
147A                5020 ;>                      PhysicalBlock := ( Ptr^.Location ) * m
147A                5021 ;>                      Done := True
147A                5022 ;>                      Found := True
147A                5023 ;>                ELSE





        WIDGET.ASSEM            Page 156
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


147A                5024 ;>                      Ptr := ( Ptr^.Ptr ) * 4
147A                5025 ;>                      IF Ptr^.Nil
147A                5026 ;>                       THEN Done := True
147A                5027 ;>       Status := Ptr^.Status
147A                5028 ;>       ElementPtr := Ptr
147A                5029 ;>       IF NOT( Found ) THEN SrchSpTable := False
147A                5030 ;>      END
147A                5031 ;>
147A                5032 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
147A                5033                 .LSTOFF
147A                5036                 .LSTON
















































        WIDGET.ASSEM            Page 157
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


147A                5037                 .Page
147A                5038                 .FIN
147A                5039                 
147A                5040 SrchSpTabl:
147A D6 17 92    20 5041                 Call    Get_HeadPtr
147D 6B 5F          5042                 Jr      Z,NotInTabl
147F                5043                 
147F B0 E7        6 5044                 Clr     !r7             ;Found := False
1481                5045                 
1481 09 41        6 5046 SrchLp:         Ld      ScrReg1,!r0     ;save current ptr
1483 D6 18 04    20 5047                 Call    Get_Ptr
1486                5048                 
1486 82 12       12 5049                 Lde     !r1,@!!r2       ;get element status
1488 19 40        6 5050                 Ld      ScrReg0,!r1     ;save element.status
148A 76 E1 40    10 5051                 Tm      !r1,#Used       ;IF Used
148D 6B 3B          5052                 Jr      Z,SrchLpElse
148F 76 E1 20    10 5053                 Tm      !r1,#Useable    ;  AND Useable
1492 6B 36          5054                 Jr      Z,SrchLpElse
1494 08 58        6 5055                 Ld      !r0,Data_Type
1496 72 10        6 5056                 Tm      !r1,!r0         ;AND Type is correct
1498 6B 30          5057                 Jr      Z,SrchLpElse
149A                5058 ;                                             AND ( Token =
149A A0 E2       10 5059                 Incw    !!r2
149C 82 12       12 5060                 Lde     !r1,@!!r2
149E 56 E1 03    10 5061                 And     !r1,#$03         ;         LogicalBlockNumber/bits 0:9 )
14A1 08 ED        6 5062                 Ld      !r0,!rD
14A3 56 E0 03    10 5063                 And     !r0,#03
14A6 A2 01        6 5064                 Cp      !r0,!r1
14A8 EB 20          5065                 Jr      Nz,SrchLpElse
14AA A0 E2       10 5066                 Incw    !!r2            ;point to bits 0:7 of token
14AC 82 02       12 5067                 Lde     !r0,@!!r2
14AE A2 0E        6 5068                 Cp      !r0,!rE
14B0 EB 18          5069                 Jr      Nz,SrchLpElse
14B2                5070                 
14B2 76 40 10    10 5071                 Tm      ScrReg0,#Spare ;check if BadBlock
14B5 EB 05          5072                 Jr      Nz,Srch_Spare
14B7                5073                 
14B7 46 E7 01    10 5074                 Or      !r7,#Found
14BA 8B 24          5075                 Jr      Srch_Sp1
14BC                5076                 
14BC 08 41        6 5077 Srch_Spare:      Ld     !r0,ScrReg1
14BE 0E           6 5078                  Inc    !r0 ;number spare blocks 1..76
14BF                5079 
14BF                5080 ;****** INLINE: MulR0_m *****
14BF B0 EE        6 5081                 Clr     !rE     ;Result := !r0 * 256
14C1 D8 E0        6 5082                 Ld      !rD,!r0
14C3 B0 EC        6 5083                 Clr     !rC
14C5                5084                 
14C5   --SKIP--     5085                 .DO     W_20MB + W_40MB
14C5   --SKIP--     5086                 Rlc     !rE     ;Result := Result * 2
14C5   --SKIP--     5087                 Rlc     !rD
14C5   --SKIP--     5088                 Rlc     !rC
14C5                5089                 .FIN
14C5   --SKIP--     5090                 .DO     W_40MB





        WIDGET.ASSEM            Page 158
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


14C5   --SKIP--     5091                 Rlc     !rE     ;Result := Result * 2
14C5   --SKIP--     5092                 Rlc     !rD
14C5   --SKIP--     5093                 Rlc     !rC
14C5                5094                 .FIN
14C5                5095                 
14C5 46 E7 01    10 5096                 Or      !r7,#Found
14C8 8B 34          5097                 Jr      SrchDone
14CA                5098                 
14CA 76 40 80    10 5099 SrchLpElse:     Tm      ScrReg0,#Nil        ;test if element.Ptr = Nil
14CD EB 0F          5100                 Jr      Nz,NotInTabl
14CF                5101                 
14CF 08 41        6 5102                  Ld     !r0,ScrReg1 ;get address to current element
14D1 D6 18 04    20 5103                 Call    Get_Ptr
14D4 06 E3 03    10 5104                 Add     !r3,#3  ;point to next Ptr
14D7 16 E2 00    10 5105                 Adc     !r2,#0
14DA 82 02       12 5106                 Lde     !r0,@!!r2
14DC 8B A3          5107                 Jr      SrchLp
14DE                5108                 
14DE B0 E7        6 5109 NotInTabl:      Clr     !r7             ;return Not_Found status
14E0                5110 
14E0 D9 4D        6 5111 Srch_Sp1:       Ld      ScrRegD,!rD
14E2                5112 
14E2                5113 ;***** INLINE: Div3_k *****
14E2 28 ED        6 5114                 Ld      !r2,!rD         ;shift right 1 byte
14E4 18 EC        6 5115                 Ld      !r1,!rC
14E6 B0 E0        6 5116                 Clr     !r0
14E8                5117                 
14E8   --SKIP--     5118                 .DO     W_20MB
14E8   --SKIP--     5119                 Ld      !rF,1           ;shift left once for DIV 128
14E8                5120                 .FIN
14E8   --SKIP--     5121                 .DO     W_40MB
14E8   --SKIP--     5122                 Ld      !rF,2           ;shift left twice for DIV 64
14E8                5123                 .FIN
14E8                5124                 
14E8   --SKIP--     5125                 .DO     W_20MB + W_40MB
14E8   --SKIP--     5126                 Ld      !r3,!rE         ;shift left 1 bit
14E8   --SKIP--     5127 Div3_k_Lp:      Rlc     !r3             ;move !r3 bit 7 into carry flag
14E8   --SKIP--     5128                 Rlc     !r2             ;then shift all 3 bytes
14E8   --SKIP--     5129                 Rlc     !r1
14E8   --SKIP--     5130                 Rlc     !r0
14E8   --SKIP--     5131                 Djnz    !rF,Div3_k_Lp
14E8                5132                 .FIN
14E8 02 E2        6 5133                 Add     !rE,!r2         ;PhysicalBlock := LogicalBlock +
14EA 12 D1        6 5134                 Adc     !rD,!r1         ;               LogicalBlock DIV k
14EC 12 C0        6 5135                 Adc     !rC,!r0
14EE 08 ED        6 5136                 Ld      !r0,!rD ;save rollover byte
14F0                5137                 
14F0                5138                 .LSTOFF
14F0                5140                 .LSTON
14F0                5141                 .FIN
14F0                5142                 .DO     W_10MB
14F0 A4 4D E0    10 5143                 Cp      !r0,ScrRegD ;check for rollover
14F3                5144                 .LSTOFF
14F3                5159                 .LSTON





        WIDGET.ASSEM            Page 159
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


14F3                5160                 .FIN
14F3                5161                 
14F3 6B 09          5162                 Jr      Z,SrchDone
14F5 06 EE 01    10 5163                 Add     !rE,#1 ;otherwise account for rollover
14F8 16 ED 00    10 5164                 Adc     !rD,#0
14FB 16 EC 00    10 5165                 Adc     !rC,#0
14FE                5166 
14FE 42 77        6 5167 SrchDone:       Or      !r7,!r7 ;set status
1500 08 40        6 5168                 Ld      !r0,ScrReg0         ;return status
1502 18 41        6 5169                 Ld      !r1,ScrReg1     ;return ptr to element
1504 8D 04 F8       5170                 Jp      Bank_Ret
1507                5171                 
1507                5172                 .LSTOFF
1507                5174                 .LSTON













































        WIDGET.ASSEM            Page 160
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1507                5175                 .Page
1507                5176 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1507                5177 ;>
1507                5178 ;>      Function: GetNewSpare
1507                5179 ;>
1507                5180 ;>      This function accepts either a physical block number or
1507                5181 ;>      a logical block number and returns a one byte index into
1507                5182 ;>      the Spare Table's bit map describing the location of the
1507                5183 ;>      block that can be used as a spare.
1507                5184 ;>
1507                5185 ;>      Inputs:
1507                5186 ;>              BlockNumber : 3 BYTES { !rC:E }
1507                5187 ;>
1507                5188 ;>      Outputs:
1507                5189 ;>              GetNewSpare : BYTE { !r0 }
1507                5190 ;>
1507                5191 ;>      Global Variables Used:
1507                5192 ;>              SpareBitMap
1507                5193 ;>
1507                5194 ;>      Local Variables:
1507                5195 ;>              Bit   : ScrReg0
1507                5196 ;>              Temp1 : ScrReg1
1507                5197 ;>              Temp2 : ScrReg2
1507                5198 ;>              NoHis : ScrReg3/bit 7
1507                5199 ;>              NoLos : ScrReg3/bit 6
1507                5200 ;>
1507                5201 ;>      Algorithm:
1507                5202 ;>
1507                5203 ;>      BEGIN
1507                5204 ;>       Bit := SrchSpTabl Div k { get physical blocknumber divided by
1507                5205 ;>                                 the number of blocks between spares }
1507                5206 ;>       IF ( SpareBitMap[ Bit ] = 0 )
1507                5207 ;>        THEN GetNewSpare := Bit
1507                5208 ;>        ELSE
1507                5209 ;>              NoHis := False
1507                5210 ;>              NoLos := False
1507                5211 ;>              Temp1 := Bit
1507                5212 ;>              WHILE NOT( NoHis ) AND ( SpareBitMap[ Temp1 ] = 1 ) DO
1507                5213 ;>                      Temp1 := Temp1 + 1
1507                5214 ;>                      IF ( Temp1 >= 76 ) THEN NoHis := True
1507                5215 ;>              Temp2 := Bit
1507                5216 ;>              WHILE NOT( NoLos ) AND ( SpareBitMap[ Temp2 ] = 1 DO
1507                5217 ;>                      Temp2 := Temp2 - 1
1507                5218 ;>                      IF ( Temp2 < 0 ) THEN NoLos := True
1507                5219 ;>              IF ( NoHis AND NoLos )
1507                5220 ;>               THEN ABORT
1507                5221 ;>               ELSE
1507                5222 ;>                IF NoHis
1507                5223 ;>                 THEN GetNewSpare := Temp2
1507                5224 ;>                 ELSE
1507                5225 ;>                  IF ( Temp1 - Bit ) > ( Bit - Temp2 )
1507                5226 ;>                   THEN GetNewSpare := Temp2
1507                5227 ;>                   ELSE GetNewSpare := Temp1
1507                5228 ;>      END





        WIDGET.ASSEM            Page 161
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1507                5229 ;>
1507                5230 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1507                5231                 .LSTOFF
1507                5234                 .LSTON























































        WIDGET.ASSEM            Page 162
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1507                5235                 .Page
1507                5236                 .FIN
1507                5237 
1507                5238 GetNewSpare:
1507 D6 10 97    20 5239                 Call    ExtPush_Vector ;save state
150A                5240                 
150A                5241                 .DO     W_10MB
150A 48 ED        6 5242                 Ld      !r4,!rD ;Div3_k, store result in !r4
150C                5243                 .FIN
150C                5244                 
150C D8 E4        6 5245                  Ld     !rD,!r4
150E CC 80        6 5246                  Ld     !rC,#TestBitMap
1510 D6 17 CA    20 5247                 Call    TSC_BitMap      ;IF BitMap[ Bit ] = 0 ...
1513 08 E4        6 5248                 Ld      !r0,!r4     ;assume Bit is unused
1515 6B 53          5249                 Jr      Z,Gns_End       ;Jump if THEN
1517                5250                 
1517 58 E4        6 5251                 Ld      !r5,!r4 ;ELSE ..
1519 B0 E7        6 5252                 Clr     !r7
151B                5253                 
151B D8 E5        6 5254 Gns_Lp1:         Ld     !rD,!r5     ;test for bit map location = 0
151D CC 80        6 5255                  Ld     !rC,#TestBitMap
151F D6 17 CA    20 5256                 Call    TSC_BitMap
1522 6B 09          5257                 Jr      Z,Gns_Lp1End
1524 5E           6 5258                 Inc     !r5 ;bump Temp1
1525 A6 E5 4C    10 5259                 Cp      !r5,#76
1528 1B F1          5260                 Jr      Lt,Gns_Lp1
152A 46 E7 80    10 5261                 Or      !r7,#$80    ;NoHis := True
152D                5262                 
152D 68 E4        6 5263 Gns_Lp1End:     Ld      !r6,!r4
152F                5264 
152F D8 E6        6 5265 Gns_Lp2:         Ld     !rD,!r6     ;test for bit map location = 0
1531 CC 80        6 5266                  Ld     !rC,#TestBitMap
1533 D6 17 CA    20 5267                 Call    TSC_BitMap
1536 6B 07          5268                 Jr      Z,Gns_Lp2End
1538 00 E6        6 5269                 Dec     !r6
153A AB F3          5270                 Jr      Gt,Gns_Lp2
153C 46 E7 40    10 5271                 Or      !r7,#$40    ;NoLos := True
153F                5272                 
153F 66 E7 C0    10 5273 Gns_Lp2End:     Tcm     !r7,#$C0    ;IF NoHis AND NoLos ..
1542 EB 0A          5274                 Jr      Nz,Gns_Chk_Hi
1544                5275                  
1544 0C 01        6 5276                  Ld     !r0,#1 ;byte 1
1546 1C 40        6 5277                  Ld     !r1,#SprBlk_Hard
1548 D6 04 03    20 5278                 Call    SetStatus
154B D6 05 1F    20 5279                 Call    Abort
154E                5280                 
154E 08 E6        6 5281 Gns_Chk_Hi:     Ld      !r0,!r6     ;assume NoHis
1550 76 E7 80    10 5282                 Tm      !r7,#$80    ;test for NoHis
1553 EB 15          5283                 Jr      Nz,Gns_End
1555                5284                 
1555 08 E5        6 5285                 Ld      !r0,!r5 ;assume NoLos
1557 76 E7 40    10 5286                 Tm      !r7,#$40 ;test for NoLos
155A EB 0E          5287                 Jr      Nz,Gns_End
155C                5288                 





        WIDGET.ASSEM            Page 163
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


155C 18 E5        6 5289                 Ld      !r1,!r5
155E 22 14        6 5290                 Sub     !r1,!r4 ;otherwise find out which is closer
1560 22 46        6 5291                 Sub     !r4,!r6
1562                5292                 
1562 08 E6        6 5293                 Ld      !r0,!r6 ;assume Temp2 is closer
1564 A2 14        6 5294                 Cp      !r1,!r4
1566 FB 02          5295                 Jr      Uge,Gns_End
1568 08 E5        6 5296                 Ld      !r0,!r5 ; otherwise Temp1 is closer
156A                5297                 
156A 70 E0          5298 Gns_End:        Push    !r0
156C D6 10 9F    20 5299                 Call    ExtPop_Vector
156F 50 E0       10 5300                 Pop     !r0
1571 8D 04 F8       5301                 Jp      Bank_Ret
1574                5302                 
1574                5303                 .LSTOFF
1574                5305                 .LSTON











































        WIDGET.ASSEM            Page 164
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1574                5306                 .Page
1574                5307 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1574                5308 ;>
1574                5309 ;>      Procedure:  AddSpare { add an element to the spare table }
1574                5310 ;>
1574                5311 ;>      This function is responsible for adding an element to the spare
1574                5312 ;>      table. It accepts a 1 byte value describing the location within
1574                5313 ;>      the spare table { it is assumed that the caller has already used
1574                5314 ;>      GetNewSpare } as well as the LogicalBlockNumber and whether the
1574                5315 ;>      block being added to the table is a Spare block or a Bad Block.
1574                5316 ;>
1574                5317 ;>      Inputs:
1574                5318 ;>              BlockType         : 3 BITS { !r8/bits 3:1 }
1574                5319 ;>              SpareType         : BOOLEAN { !r8/bit 4 }
1574                5320 ;>              Location          : BYTE { !rF }
1574                5321 ;>              LogicalBlockNumber: 3 BYTES { !rC, !rD, !rE }
1574                5322 ;>
1574                5323 ;>      Outputs: { none }
1574                5324 ;>
1574                5325 ;>      Local Variables:
1574                5326 ;>              HeadPtr : 1 BYTE { !r0 }
1574                5327 ;>              Ptr     : 1 BYTE { !r0, offset; !!r8, actual Ptr }
1574                5328 ;>
1574                5329 ;>      Global Variables Changed:
1574                5330 ;>              SpareCount
1574                5331 ;>
1574                5332 ;>      Algorithm:
1574                5333 ;>
1574                5334 ;>      BEGIN
1574                5335 ;>       HeadPtr :=  Get_HeadPtr( LogicalBlockNumber )
1574                5336 ;>       IF HeadPtr.Nil
1574                5337 ;>        THEN
1574                5338 ;>              HeadPtr.Nil := False
1574                5339 ;>              HeadPtr.Ptr := Location
1574                5340 ;>              SegPtrArray[ LogicalBlockNumber/bits 10:16 ] := HeadPtr
1574                5341 ;>        ELSE
1574                5342 ;>              Ptr := HeadPtr.Ptr
1574                5343 ;>              Ptr := Get_EoList( Ptr )
1574                5344 ;>              Ptr^.Nil := False
1574                5345 ;>              Ptr^.Ptr := Location
1574                5346 ;>       Ptr := Get_Ptr( Location )
1574                5347 ;>       Ptr^.Nil := True
1574                5348 ;>       Ptr^.Used := True
1574                5349 ;>       Ptr^.Useable := True
1574                5350 ;>       Ptr^.Spare := Spare
1574                5351 ;>       Ptr^.Type := SpareType
1574                5352 ;>       Ptr^.Token := LogicalBlockNumber/bits 0:9
1574                5353 ;>       TCS_BitMap( Set, Location ) { set the bit map location for the add }
1574                5354 ;>       IF ( SpareType = Spare )
1574                5355 ;>        THEN SpareCount := SpareCount + 1
1574                5356 ;>        ELSE BadCount := BadCount + 1
1574                5357 ;>      END
1574                5358 ;>
1574                5359 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>





        WIDGET.ASSEM            Page 165
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1574                5360                 .LSTOFF
1574                5363                 .LSTON

























































        WIDGET.ASSEM            Page 166
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1574                5364                 .Page
1574                5365                 .FIN
1574                5366                 
1574                5367 AddSpare:
1574 D6 17 92    20 5368                 Call    Get_HeadPtr     ;IF HeadPtr.Nil ...
1577 EB 09          5369                 Jr      Nz,ADS_Else1
1579                5370                 
1579 56 E0 7F    10 5371                 And     !r0,#$FF-Nil    ;THEN HeadPt.Nil := False
157C 42 0F        6 5372                 Or      !r0,!rF         ;     HeadPtr.Ptr := Location
157E 92 02       12 5373                 Lde     @!!r2,!r0       ; create link
1580 8B 10          5374                 Jr      ADS_UpDate
1582                5375                 
1582 D6 17 AF    20 5376 ADS_Else1:      Call    Get_EoList      ;search 'til end of list
1585 56 E1 7F    10 5377                 And     !r1,#$FF-Nil    ;Ptr^.Nil := False
1588 92 12       12 5378                 Lde     @!!r2,!r1       ;update table
158A                5379                 
158A 06 E3 03    10 5380                 Add     !r3,#3          ;get Ptr^.Ptr
158D 16 E2 00    10 5381                 Adc     !r2,#0
1590 92 F2       12 5382                 Lde     @!!r2,!rF       ;create link
1592                5383                 
1592 08 EF        6 5384 ADS_UpDate:      Ld     !r0,!rF         ;get structure ptr
1594 D6 18 04    20 5385                 Call    Get_Ptr         ;create a real ptr out of it
1597                5386                 
1597 0C E0        6 5387                 Ld      !r0,#Nil+Used+Useable
1599 42 08        6 5388                 Or      !r0,!r8 ;merge Spare/Bad Block/Type Info
159B 44 58 E0    10 5389                 Or      !r0,Data_Type
159E 92 02       12 5390                 Lde     @!!r2,!r0
15A0 A0 E2       10 5391                 Incw    !!r2            ;point to element.HiToken
15A2 08 ED        6 5392                 Ld      !r0,!rD         ;get HiToken
15A4 56 E0 03    10 5393                 And     !r0,#$03
15A7 92 02       12 5394                 Lde     @!!r2,!r0
15A9 A0 E2       10 5395                 Incw    !!r2            ;point to element.LoToken
15AB 92 E2       12 5396                 Lde     @!!r2,!rE       ;store LoToken
15AD                5397                 
15AD CC 40        6 5398                  Ld     !rC,#SetBitMap
15AF D8 EF        6 5399                  Ld     !rD,!rF
15B1 D6 17 CA    20 5400                 Call    TSC_BitMap      ;update the bit map
15B4 8D 04 F8       5401                 Jp      Bank_Ret
15B7                5402                 
15B7                5403                 .LSTOFF
15B7                5405                 .LSTON


















        WIDGET.ASSEM            Page 167
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


15B7                5406                 .Page
15B7                5407 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
15B7                5408 ;>
15B7                5409 ;>      Procedure:  DeleteSpare { add an element to the spare table }
15B7                5410 ;>
15B7                5411 ;>      This function is responsible for deleting an element from the spare
15B7                5412 ;>      table. It accepts a 1 byte value describing the location within
15B7                5413 ;>      the spare table { it is assumed that the caller has already used
15B7                5414 ;>      GetNewSpare } as well as the LogicalBlockNumber.
15B7                5415 ;>
15B7                5416 ;>      Inputs:
15B7                5417 ;>              Location          : BYTE { !rF }
15B7                5418 ;>              LogicalBlockNumber: 3 BYTES { !rC, !rD, !rE }
15B7                5419 ;>
15B7                5420 ;>      Outputs: { none }
15B7                5421 ;>
15B7                5422 ;>      Local Variables:
15B7                5423 ;>              Ptr1^.Status : BYTE { ScrRegF }
15B7                5424 ;>
15B7                5425 ;>      Global Variables Changed:
15B7                5426 ;>              SpareCount
15B7                5427 ;>
15B7                5428 ;>      Algorithm:
15B7                5429 ;>
15B7                5430 ;>      BEGIN
15B7                5431 ;>       Location := SrchSpTabl( Load_Logical )
15B7                5432 ;>       IF NOT( SrchSpTabl.Found ) THEN Abort
15B7                5433 ;>       IF ( Get_Head( LogicalBlockNumber ).Ptr = Location )
15B7                5434 ;>        THEN Head.Nil = True
15B7                5435 ;>        ELSE
15B7                5436 ;>             Ptr1 := Get_Ptr( Location )
15B7                5437 ;>             IF ( Ptr1^.Nil = True )
15B7                5438 ;>              THEN Ptr( PreviousElement )^.Nil = True
15B7                5439 ;>              ELSE Ptr( PreviousElement )^.Ptr = Ptr1^.Ptr
15B7                5440 ;>       Zero Out the Deleted Element
15B7                5441 ;>       TCS_BitMap( Clear, Location ) { free up the bit map location }
15B7                5442 ;>      END
15B7                5443 ;>
15B7                5444 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
15B7                5445                 .LSTOFF
15B7                5448                 .LSTON


















        WIDGET.ASSEM            Page 168
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


15B7                5449                 .Page
15B7                5450                 .FIN
15B7                5451                 
15B7                5452 DeleteSpare:
15B7 D6 06 0D    20 5453                 Call    Load_Logical
15BA D6 14 7A    20 5454                 Call    SrchSpTabl
15BD F8 E1        6 5455                 Ld      !rF,!r1
15BF EB 03          5456                 Jr      Nz,Chk_HdPtr
15C1                5457                 
15C1 D6 05 1F    20 5458                 Call    Abort
15C4                5459                 
15C4 D6 06 0D    20 5460 Chk_HdPtr:      Call    Load_Logical
15C7 D6 17 92    20 5461                 Call    Get_HeadPtr     ;IF ( Get_HeadPtr... )
15CA 09 4E        6 5462                 Ld      ScrRegE,!r0
15CC 08 EF        6 5463                 Ld      !r0,!rF
15CE D6 18 04    20 5464                 Call    Get_Ptr
15D1 82 02       12 5465                 Lde     !r0,@!!r2
15D3 76 E0 80    10 5466                 Tm      !r0,#Nil
15D6 6B 0E          5467                 Jr      Z,Chk_Chain
15D8 A4 EF 4E    10 5468                 Cp      ScrRegE,!rF
15DB EB 09          5469                 Jr      Nz,Chk_Chain    ;ELSE ...
15DD                5470                 
15DD D6 17 92    20 5471                 Call    Get_HeadPtr
15E0 0C 80        6 5472                 Ld      !r0,#Nil        ;THEN Head.Nil := True
15E2 92 02       12 5473                 Lde     @!!r2,!r0
15E4 8B 47          5474                 Jr      Zero_Element
15E6                5475                 
15E6 09 4F        6 5476 Chk_Chain:      Ld      ScrRegF,!r0
15E8 46 E0 80    10 5477                 Or      !r0,#Nil
15EB 92 02       12 5478                 Lde     @!!r2,!r0       ;break the chain
15ED                5479                 
15ED 08 4E        6 5480                  Ld      !r0,ScrRegE
15EF D6 17 AF    20 5481                 Call    Get_EoList      ;get Ptr( Previous ) in ScrReg0,1
15F2                5482                 
15F2 08 4F        6 5483                 Ld      !r0,ScrRegF     ;get original status back
15F4 76 E0 80    10 5484                 Tm      !r0,#Nil        ;IF Ptr1^.Nil
15F7 28 40        6 5485                 Ld      !r2,ScrReg0     ;get Ptr( Previous )
15F9 38 41        6 5486                 Ld      !r3,ScrReg1
15FB 6B 09          5487                 Jr      Z,D_Chk_Else    ; ELSE...
15FD                5488                 
15FD 82 02       12 5489                 Lde     !r0,@!!r2
15FF 46 E0 80    10 5490                 Or      !r0,#Nil
1602 92 02       12 5491                 Lde     @!!r2,!r0
1604 8B 27          5492                 Jr      Zero_Element
1606                5493                 
1606 A4 4E EF    10 5494 D_Chk_Else:     Cp      !rF,ScrRegE
1609 EB 05          5495                 Jr      Nz,Get_Previous
160B D6 17 92    20 5496                 Call    Get_HeadPtr
160E 8B 06          5497                 Jr      Save_Previous
1610                5498                 
1610 06 E3 03    10 5499 Get_Previous:   Add     !r3,#3          ;get to Ptr( Previous )^.Ptr
1613 16 E2 00    10 5500                 Adc     !r2,#0
1616 70 E2          5501 Save_Previous:  Push    !r2
1618 70 E3          5502                 Push    !r3





        WIDGET.ASSEM            Page 169
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


161A                5503                  
161A 08 EF        6 5504                  Ld      !r0,!rF
161C D6 18 04    20 5505                 Call    Get_Ptr
161F 06 E3 03    10 5506                 Add     !r3,#3          ;get to Ptr1^.Ptr
1622 16 E2 00    10 5507                 Adc     !r2,#0
1625 82 02       12 5508                 Lde     !r0,@!!r2
1627                5509                 
1627 50 E3       10 5510                 Pop     !r3
1629 50 E2       10 5511                 Pop     !r2
162B 92 02       12 5512                 Lde     @!!r2,!r0       ;Ptr( Previous )^.Ptr := Ptr1^.Ptr
162D                5513                 
162D 08 EF        6 5514 Zero_Element:    Ld      !r0,!rF         ;get Ptr1 once more
162F D6 18 04    20 5515                 Call    Get_Ptr
1632                5516                 
1632 0C FF        6 5517                 Ld      !r0,#$FF ;initiale element
1634 1C 04        6 5518                 Ld      !r1,#4          ;zero 4 bytes
1636 92 02       12 5519 Zero_E_Lp:      Lde     @!!r2,!r0
1638 A0 E2       10 5520                 Incw    !!r2
163A 1A FA          5521                 Djnz    !r1,Zero_E_Lp
163C                5522                 
163C CC 20        6 5523                  Ld     !rC,#ClearBitMap
163E D8 EF        6 5524                  Ld     !rD,!rF
1640 D6 17 CA    20 5525                 Call    TSC_BitMap
1643 8D 04 F8       5526                 Jp      Bank_Ret
1646                5527                 
1646                5528                 .LSTOFF
1646                5533                 .LSTON
































        WIDGET.ASSEM            Page 170
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1646                5534                 .Page
1646                5535 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1646                5536 ;>
1646                5537 ;>      Module: Cache
1646                5538 ;>
1646                5539 ;>      The name of this module is a bit misleading: there is no true
1646                5540 ;>      cache implemented at this time. However, there is an attempt made
1646                5541 ;>      at some primitive look-ahead methods to reduce the access time
1646                5542 ;>      of the disk. This module contains those routines that are
1646                5543 ;>      chiefly involved with the look-ahead algorithm.
1646                5544 ;>
1646                5545 ;>      FUNCTION CnvrtLogical( LogicalBlock : 3 BYTES { !rC:E } ) :
1646                5546 ;>                           CnvrtLogical : BOOLEAN { true if block spared }
1646                5547 ;>                           Cylinder : WORD { !!rC }
1646                5548 ;>                           Head : BYTE { !rE }
1646                5549 ;>                           Sector : BYTE { !rF }
1646                5550 ;>                           Status : BYTE { !r0 }
1646                5551 ;>                           Ptr : BYTE { !r1 }
1646                5552 ;>      FUNCTION SrchCach( LogicalBlock : 3 BYTES { !rC:E }
1646                5553 ;>                         Random : BOOLEAN { !r7/Bit 7 }
1646                5554 ;>                         Offset : 3 BITS { !r7/Bits 2:0 } ) :
1646                5555 ;>                       BOOLEAN
1646                5556 ;>                       HeadSector : BYTE { !r0 }
1646                5557 ;>
1646                5558 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1646                5559                 .LSTOFF
1646                5562                 .LSTON
































        WIDGET.ASSEM            Page 171
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1646                5563                 .Page
1646                5564 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1646                5565 ;>
1646                5566 ;>      Function: CnvrtLogical  { ConvertLogicalBlock }
1646                5567 ;>
1646                5568 ;>      This function is responsible for converting a logical block
1646                5569 ;>      number to a physical block number by first searching the spare
1646                5570 ;>      table and then doing the appropriate arithmetic to arrive at
1646                5571 ;>      the cylinder, head, and sector value.
1646                5572 ;>
1646                5573 ;>      Inputs:
1646                5574 ;>              LogicalBlockNumber : 3 BYTES { !rC, !rD, !rE }
1646                5575 ;>
1646                5576 ;>      Outputs:
1646                5577 ;>              Cylinder : WORD { !rC, !rD }
1646                5578 ;>              Head     : BYTE { !rE }
1646                5579 ;>              Sector   : BYTE { !rF }
1646                5580 ;>              Status   : BYTE { !r0, returned from search spare table }
1646                5581 ;>              Ptr      : BYTE { !r1, returned from search spare table }
1646                5582 ;>
1646                5583 ;>
1646                5584 ;>      Local Variables:
1646                5585 ;>              PhysicalBlock : 3 BYTES { !rC, !rD, rE }
1646                5586 ;>              Temp          : 3 BYTES { !r1, !r2, !r3 }
1646                5587 ;>
1646                5588 ;>      Algorithm:
1646                5589 ;>
1646                5590 ;>       BEGIN
1646                5591 ;>        IF LogicalBlock > MaxLogicalBlock THEN ABORT
1646                5592 ;>        PhysicalBlock := SearchSpareTable( LogicalBlock )
1646                5593 ;>        Cylinder := PhysicalBlock DIV ( Heads * Sectors )
1646                5594 ;>        Temp := PhysicalBlock MOD ( Heads * Sectors )
1646                5595 ;>        Head := Temp DIV Sectors
1646                5596 ;>        Sector := Temp MOD Sectors
1646                5597 ;>       END
1646                5598 ;>
1646                5599 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1646                5600                 .LSTOFF
1646                5603                 .LSTON




















        WIDGET.ASSEM            Page 172
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1646                5604                 .Page
1646                5605                 .FIN
1646                5606 
1646                5607 CnvrtLogical:
1646 D6 14 7A    20 5608 CnvrtSrch:      Call    SrchSpTabl      ;check if logical block in spare table
1649 70 FC          5609                 Push    Flags           ;save results
164B 70 E0          5610                 Push    !r0             ;save status
164D 70 E1          5611                 Push    !r1             ;save ptr
164F                5612                 
164F 2C 20        6 5613                  Ld     !r2,#.HIBYTE. Get_Cyl_H_S
1651 3C DA        6 5614                  Ld     !r3,#.LOWBYTE. Get_Cyl_H_S
1653 D6 04 AB    20 5615                 Call    Bank_Call     ;get cylinder, head,and sector
1656 08 EF        6 5616                  Ld     !r0,!rF         ;pass physical sector
1658 2C 25        6 5617                  Ld     !r2,#.HIBYTE. ReMap_Sector
165A 3C F0        6 5618                  Ld     !r3,#.LOWBYTE. ReMap_Sector
165C D6 04 AB    20 5619                 Call    Bank_Call
165F F8 E0        6 5620                  Ld     !rF,!r0         ;            !rF := logical sector
1661                5621                 
1661 50 E1       10 5622                 Pop     !r1             ;Element.Ptr
1663 50 E0       10 5623                 Pop     !r0             ;Search Status
1665 50 FC       10 5624                 Pop     Flags
1667                5625                 
1667 8D 04 F8       5626                 Jp      Bank_Ret
166A                5627                 
166A                5628                 .LSTOFF
166A                5630                 .LSTON

































        WIDGET.ASSEM            Page 173
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


166A                5631                 .Page
166A                5632 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
166A                5633 ;>
166A                5634 ;>      Function: SrchCache
166A                5635 ;>
166A                5636 ;>      This funtion searches the block cache and returns both a 
166A                5637 ;>      boolean variable ( indicating whether the block is in the 
166A                5638 ;>      cache AND if there is a seek associated with it ), as well
166A                5639 ;>      as a info as to whether a head select may be needed. The
166A                5640 ;>      cache may be searched sequentially, or randomly ( as is the
166A                5641 ;>      case for multiblock commands. ).
166A                5642 ;>
166A                5643 ;>      Inputs:
166A                5644 ;>              LogicalBlock : 3 BYTES { !rC:E }
166A                5645 ;>              Offset       : 3 BYTE  { !r0 }
166A                5646 ;>              WORKING REGISTER SET MUST BE Wrk_Sys
166A                5647 ;>
166A                5648 ;>      Outputs:
166A                5649 ;>              SrchCache : BOOLEAN { zero flag is set if block is not
166A                5650 ;>                                    in the cache OR if there is a seek
166A                5651 ;>                                    needed to get to the block }
166A                5652 ;>              HeadSector  : BYTE { !r0 }
166A                5653 ;>
166A                5654 ;>      Algorithm:
166A                5655 ;>
166A                5656 ;>      BEGIN
166A                5657 ;>       i := 1
166A                5658 ;>       SrchCache := False
166A                5659 ;>       IF ( CacheArray[ Offset ].LogicalBlock = Logical Block )
166A                5660 ;>        THEN
166A                5661 ;>             Found := True
166A                5662 ;>             CachStat := CacheStatus[ Offset ]
166A                5663 ;>             IF NOT( CachStat.Seek )
166A                5664 ;>              THEN SrchCache := True
166A                5665 ;>      END
166A                5666 ;>
166A                5667 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
166A                5668                 .LSTOFF
166A                5671                 .LSTON




















        WIDGET.ASSEM            Page 174
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


166A                5672                 .Page
166A                5673                 .FIN
166A                5674 
166A                5675 SrchCache:
166A 31 40        6 5676                 Srp     #Wrk_Scr
166C 4C 14        6 5677                 Ld      !r4,#CacheLength
166E                5678                 
166E AC 16        6 5679 Srch_C_Lp:      Ld      !rA,#.HIBYTE. CacheArray
1670 BC FC        6 5680                 Ld      !rB,#.LOWBYTE. CacheArray
1672 08 5B        6 5681                 Ld      !r0,Cache_Index
1674 90 E0        6 5682                 Rl      !r0 ;multiply by 4
1676 90 E0        6 5683                 Rl      !r0
1678 02 B0        6 5684                 Add     !rB,!r0 ;index into array
167A 16 EA 00    10 5685                 Adc     !rA,#0
167D                5686                 
167D 8C 40        6 5687                 Ld      !r8,#ScrReg0
167F                5688                 
167F 83 8A       18 5689                 Ldei    @!r8,@!!rA ;load CacheArray.Logical
1681 83 8A       18 5690                 Ldei    @!r8,@!!rA
1683 83 8A       18 5691                 Ldei    @!r8,@!!rA
1685 B4 1C E0    10 5692                 Xor     !r0,Wrk_Sys+$C ;compare values
1688 B4 1D E1    10 5693                 Xor     !r1,Wrk_Sys+$D
168B B4 1E E2    10 5694                 Xor     !r2,Wrk_Sys+$E
168E 42 01        6 5695                 Or      !r0,!r1 ;test for zero
1690 42 02        6 5696                 Or      !r0,!r2
1692 EB 17          5697                 Jr      Nz,Srch_More
1694                5698                 
1694 8C 16        6 5699                 Ld      !r8,#.HIBYTE. CachStat ;get CacheStatus
1696 9C E8        6 5700                 Ld      !r9,#.LOWBYTE. CachStat
1698 04 5B E9    10 5701                 Add     !r9,Cache_Index
169B 20 5B        6 5702                 Inc     Cache_Index
169D 82 18       12 5703                 Lde     !r1,@!!r8
169F 19 5A        6 5704                 Ld      BlkStat,!r1 ;save search result
16A1 82 0A       12 5705                 Lde     !r0,@!!rA ;get Head/Sector info
16A3                5706                 
16A3 31 10        6 5707 Srch_C_End:     Srp     #Wrk_Sys ;get back to normal system context
16A5 08 40        6 5708                 Ld      !r0,ScrReg0 ;pass head/sector info back
16A7 76 5A 80    10 5709                 Tm      BlkStat,#CachSeek ;set seekneeded flag
16AA AF          14 5710                 Ret
16AB                5711 
16AB 20 5B        6 5712 Srch_More:      Inc     Cache_Index
16AD A6 5B 14    10 5713                 Cp      Cache_Index,#CacheLength ;check for cache overflow
16B0 1B 02          5714                 Jr      Lt,Srch_M_1
16B2                5715                 
16B2 B0 5B        6 5716                 Clr     Cache_Index
16B4 4A B8          5717 Srch_M_1:       Djnz    !r4,Srch_C_Lp
16B6                5718                 
16B6 E6 5A 80    10 5719                 Ld      BlkStat,#CachSeek
16B9 B0 5B        6 5720                 Clr     Cache_Index
16BB 8B E6          5721                 Jr      Srch_C_End
16BD                5722                 
16BD                5723                 .LSTOFF
16BD                5728                 .LSTON






        WIDGET.ASSEM            Page 175
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


16BD                5729                 .Page
16BD                5730 ;>>>>>>>>>>>>>>>>>>>>>>>>
16BD                5731 ;>
16BD                5732 ;>      Module: Data Exception Handling
16BD                5733 ;>
16BD                5734 ;>      PROCEDURE: Data_Ex_Handler( ErrorCode : 7 BITS { !r0/Bits 6:0 } )
16BD                5735 ;>
16BD                5736 ;>>>>>>>>>>>>>>>>>>>>>>>>
16BD                5737                 .LSTOFF
16BD                5740                 .LSTON

















































        WIDGET.ASSEM            Page 176
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


16BD                5741                 .Page
16BD                5742 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
16BD                5743 ;>
16BD                5744 ;>      Procedure: Data_Ex_Handler { data exception handler }
16BD                5745 ;>
16BD                5746 ;>      This procedure is responsible for cleaning up after some sort
16BD                5747 ;>      of data error ( spareing, bad-blocking, etc. ). It is
16BD                5748 ;>      assumed that if spareing is going to occur that correct data must
16BD                5749 ;>      be residing in Buffer2.
16BD                5750 ;>
16BD                5751 ;>      Inputs:
16BD                5752 ;>              ErrorCode : 7 BITS { !r0/Bits 6:0 }
16BD                5753 ;>
16BD                5754 ;>      Outputs: { none }
16BD                5755 ;>
16BD                5756 ;>      Algorithm:
16BD                5757 ;>
16BD                5758 ;>      BEGIN
16BD                5759 ;>       IF NOT( DiskStatus.Wr_Op ) THEN SetStatus( ReadError )
16BD                5760 ;>       CASE ErrorCode OF
16BD                5761 ;>        0 : SetStatus( OperationFailed )
16BD                5762 ;>
16BD                5763 ;>        2 : Spare( Spare )
16BD                5764 ;>
16BD                5765 ;>        4 : Spare( BadBlock )
16BD                5766 ;>            SetStatus( OperationFailed )
16BD                5767 ;>
16BD                5768 ;>        6 : SetStatus( ErrorCount )
16BD                5769 ;>
16BD                5770 ;>        8 : SetStatus( NoHeaderFound )
16BD                5771 ;>            Spare( BadBlock )
16BD                5772 ;>            SetStatus( OperationFailed )
16BD                5773 ;>
16BD                5774 ;>        A : SetStatus( NoHeaderFound )
16BD                5775 ;>            Spare( Spare )
16BD                5776 ;>       OTHERWISE Abort
16BD                5777 ;>      END
16BD                5778 ;>
16BD                5779 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
16BD                5780                 .LSTOFF
16BD                5783                 .LSTON


















        WIDGET.ASSEM            Page 177
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


16BD                5784                 .Page
16BD                5785                 .FIN
16BD                5786 
16BD                5787 Data_Ex_Handler:
16BD 70 E0          5788                 Push    !r0 ;save error code
16BF                5789                  
16BF D6 10 97    20 5790                 Call    ExtPush_Vector ;save state
16C2                5791                 
16C2 76 56 20    10 5792                 Tm      DiskStat,#Wr_Op
16C5 6B 09          5793                 Jr      Z,Data_Ex_RdErr
16C7                5794                 
16C7 0C 03        6 5795                  Ld     !r0,#3 ;load status byte 3
16C9 18 29        6 5796                  Ld     !r1,WrErrCnt
16CB D6 04 03    20 5797                 Call    SetStatus
16CE 8B 03          5798                 Jr      Data_Ex_Case
16D0                5799                 
16D0 D6 05 95    20 5800 Data_Ex_RdErr:  Call    SS_ReadErr
16D3                5801                 
16D3 2C 29        6 5802 Data_Ex_Case:    Ld     !r2,#.HIBYTE. Set_SeekNeeded
16D5 3C FD        6 5803                  Ld     !r3,#.LOWBYTE. Set_SeekNeeded
16D7 D6 04 AB    20 5804                 Call    Bank_Call ;update cache on next Pro/Sys command
16DA                5805                 
16DA 50 E1       10 5806                 Pop     !r1 ;get error code back
16DC 56 E1 7F    10 5807                 And     !r1,#$7F ;mask off error flag
16DF 76 E1 01    10 5808                 Tm      !r1,#01 ;see if error code is odd
16E2 EB 05          5809                 Jr      Nz,Data_Ex_Abort
16E4 A6 E1 0A    10 5810                 Cp      !r1,#Ex_Case_Max ;bounds check
16E7 2B 03          5811                 Jr      Le,Data_Ex_Cmnd
16E9                5812                 
16E9 D6 05 1F    20 5813 Data_Ex_Abort:  Call    Abort
16EC                5814                 
16EC 2C 16        6 5815 Data_Ex_Cmnd:   Ld      !r2,#.HIBYTE. Ex_Jp_Tbl
16EE 3C FD        6 5816                 Ld      !r3,#.LOWBYTE. Ex_Jp_Tbl
16F0 02 31        6 5817                 Add     !r3,!r1 ;add offset
16F2 16 E2 00    10 5818                 Adc     !r2,#0
16F5 C2 E2       12 5819                 Ldc     !rE,@!!r2 ;get routine to execute
16F7 A0 E2       10 5820                 Incw    !!r2
16F9 C2 F2       12 5821                 Ldc     !rF,@!!r2
16FB 30 EE        8 5822                 Jp      @!rE ;go to routine
16FD                5823                 
16FD 17 09          5824 Ex_Jp_Tbl:      .DW     X_Undeter
16FF 17 0E          5825                 .DW     X_Spare
1701 17 15          5826                 .DW     X_BadBlock
1703 17 29          5827                 .DW     X_ReadErr
1705 17 39          5828                 .DW     X_HdrBadBlock
1707 17 5F          5829                 .DW     X_HdrSpare
1709                5830                 
1709 D6 05 87    20 5831 X_Undeter:      Call    SS_OpFail
170C 8B 25          5832                 Jr      Except_Return
170E                5833                 
170E AC 10        6 5834 X_Spare:        Ld      !rA,#Spare
1710 D6 13 53    20 5835 X_Spr_Call:     Call    SprBlock
1713 8B 1E          5836                 Jr      Except_Return
1715                5837                 





        WIDGET.ASSEM            Page 178
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1715 4C 04        6 5838 X_BadBlock:     Ld      !r4,#4 ;retry 4 times
1717 70 E4          5839 X_BB_Lp:        Push    !r4
1719 D6 17 64    20 5840                 Call    Bad_Recover
171C 50 E4       10 5841                 Pop     !r4
171E EB EE          5842                 Jr      Nz,X_Spare
1720 4A F5          5843                 Djnz    !r4,X_BB_Lp
1722                5844                 
1722 D6 05 87    20 5845                 Call    SS_OpFail
1725 AC 00        6 5846                  Ld     !rA,#BadBlock
1727 8B E7          5847                 Jr      X_Spr_Call
1729                5848                 
1729 D6 05 95    20 5849 X_ReadErr:      Call    SS_ReadErr
172C 2C 20        6 5850                  Ld     !r2,#.HIBYTE. Buf2_To_RBuf
172E 3C 5B        6 5851                  Ld     !r3,#.LOWBYTE. Buf2_To_RBuf
1730 D6 04 AB    20 5852                 Call    Bank_Call
1733 D6 10 9F    20 5853 Except_Return:  Call    ExtPop_Vector
1736 8D 04 F8       5854                 Jp      Bank_Ret
1739                5855                 
1739 D6 17 64    20 5856 X_HdrBadBlock:  Call    Bad_Recover
173C EB D0          5857                 Jr      Nz,X_Spare
173E D6 05 A2    20 5858                 Call    SS_NoHdr
1741 D6 11 24    20 5859                 Call    LocateSector
1744 2C 20        6 5860                  Ld     !r2,#.HIBYTE. ReadHdr
1746 3C 07        6 5861                  Ld     !r3,#.LOWBYTE. ReadHdr
1748 D6 04 AB    20 5862                 Call    Bank_Call
174B 6B 09          5863                 Jr      Z,X_Hdr_Crct
174D                5864                  
174D 2C 20        6 5865                  Ld     !r2,#.HIBYTE. RBuf_To_Buf2
174F 3C 8F        6 5866                  Ld     !r3,#.LOWBYTE. RBuf_To_Buf2
1751 D6 04 AB    20 5867                 Call    Bank_Call
1754 8B B8          5868                 Jr      X_Spare
1756                5869                 
1756 2C 2E        6 5870 X_Hdr_Crct:      Ld     !r2,#.HIBYTE. Ecc
1758 3C 72        6 5871                  Ld     !r3,#.LOWBYTE. Ecc
175A D6 04 AB    20 5872                 Call    Bank_Call
175D 6B B6          5873                 Jr      Z,X_BadBlock
175F                5874 
175F D6 05 A2    20 5875 X_HdrSpare:     Call    SS_NoHdr
1762 8B AA          5876                 Jr      X_Spare
1764                5877                 
1764                5878                 .LSTOFF
1764                5880                 .LSTON

















        WIDGET.ASSEM            Page 179
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1764                5881                 .Page
1764                5882 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1764                5883 ;>
1764                5884 ;>      Function: Bad_Recover
1764                5885 ;>
1764                5886 ;>      This function is called when a block can not be read, either the
1764                5887 ;>      header can not be found or there is a hard data error. The purpose
1764                5888 ;>      here is to use the auto offset capabilities of the servo controller
1764                5889 ;>      and reread the block.
1764                5890 ;>
1764                5891 ;>      Inputs: { none }
1764                5892 ;>
1764                5893 ;>      Outputs:
1764                5894 ;>              Bad_Recover: BOOLEAN { zero flag set if failure on retry }
1764                5895 ;>
1764                5896 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1764                5897                 .LSTOFF
1764                5900                 .LSTON









































        WIDGET.ASSEM            Page 180
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1764                5901                 .Page
1764                5902                 .FIN
1764                5903                 
1764                5904 Bad_Recover:
1764 76 56 01    10 5905                 Tm      DiskStat,#Offset_On ;check for auto_offset
1767 EB 03          5906                 Jr      Nz,B_Rcvr_Read
1769                5907                 
1769 D6 05 CA    20 5908                 Call    ReSeek
176C                5909 
176C D6 12 F2    20 5910 B_Rcvr_Read:    Call    Read_Common
176F EB 20          5911                 Jr      Nz,Bad_Rcvr_Ret
1771                5912                 
1771 A6 E0 86    10 5913                 Cp      !r0,#Error+Ex_ReadErr
1774 6B 10          5914                 Jr      Z,Bad_Rc_Spr
1776                5915                 
1776 A6 E0 84    10 5916                 Cp      !r0,#Error+Ex_BadBlock
1779 6B 0F          5917                 Jr      Z,Bad_Rc_Ecc
177B                5918                 
177B A6 E0 82    10 5919                 Cp      !r0,#Error+Ex_SprBlock
177E 6B 06          5920                 Jr      Z,Bad_Rc_Spr
1780                5921                 
1780 0C 00        6 5922                 Ld      !r0,#0
1782 42 00        6 5923 Bad_Rc_Set:     Or      !r0,!r0
1784 8B 0B          5924                 Jr      Bad_Rcvr_Ret
1786                5925                 
1786 0C 01        6 5926 Bad_Rc_Spr:     Ld      !r0,#1
1788 8B F8          5927                 Jr      Bad_Rc_Set
178A                5928                 
178A 2C 2E        6 5929 Bad_Rc_Ecc:      Ld     !r2,#.HIBYTE. Ecc
178C 3C 72        6 5930                  Ld     !r3,#.LOWBYTE. Ecc
178E D6 04 AB    20 5931                 Call    Bank_Call
1791                5932                 
1791 AF          14 5933 Bad_Rcvr_Ret:   Ret
1792                5934                 
1792                5935                 .LSTOFF
1792                5940                 .LSTON























        WIDGET.ASSEM            Page 181
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1792                5941                 .Page
1792                5942 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1792                5943 ;>
1792                5944 ;>      Module: SprUtils  { Spare Module's Utilities }
1792                5945 ;>
1792                5946 ;>      This module contains all the primitive utulitie procedures
1792                5947 ;>      used by the module: Spare
1792                5948 ;>
1792                5949 ;>      FUNCTION Get_HeadPtr( LogicalBlock : 3 BYTES { !rC:E } ) : 
1792                5950 ;>                          BOOLEAN
1792                5951 ;>                          HeadPtr : BYTE { !r0 }
1792                5952 ;>                          ArrayPtr : PTR { !!r2 }
1792                5953 ;>      FUNCTION Get_EoList( Start_Ptr : BYTE { !r0 } ) : 
1792                5954 ;>                         SparePtr : BYTE { !r0 }
1792                5955 ;>                         ElementStatus : BYTE { !r1 }
1792                5956 ;>                         Ptr : PTR { !!r2 }
1792                5957 ;>                         PreviousPtr : PTR { ScrReg0:1 }
1792                5958 ;>      FUNCTION TSC_BitMap( TestBit : BOOLEAN { !rC/bit 7 }
1792                5959 ;>                           SetBit : BOOLEAN { !rC/bit 6 }
1792                5960 ;>                           ClearBit : BOOLEAN { !rC/bit 5 }
1792                5961 ;>                           Location : BYTE { !rD }
1792                5962 ;>                         ) : BOOLEAN
1792                5963 ;>      FUNCTION Get_Ptr( SparePtr : BYTE { !r0 } ) : Ptr : PTR { !r2 }
1792                5964 ;>      FUNCTION Get_Spr_Code : 2 BITS { !r0/Bits 1:0 }
1792                5965 ;>
1792                5966 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1792                5967                 .LSTOFF
1792                5970                 .LSTON































        WIDGET.ASSEM            Page 182
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1792                5971                 .Page
1792                5972 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1792                5973 ;>
1792                5974 ;>      Function: Get_HeadPtr
1792                5975 ;>
1792                5976 ;>      This function searches the SegPtrArray { that array for the
1792                5977 ;>      spare table that contains the various head ptrs for the
1792                5978 ;>      spare table } and returns the HeadPtr that corresponds to the
1792                5979 ;>      list whose elements all have the first 7 bits of the { passed
1792                5980 ;>      in } LogicalBlockNumber.
1792                5981 ;>
1792                5982 ;>      Inputs:
1792                5983 ;>              LogicalBlockNumber : 3 BYTES { !rC:E }
1792                5984 ;>
1792                5985 ;>      Outputs:
1792                5986 ;>              Get_HeadPtr : BOOLEAN { zero is set if HeadPtr.Nil is true }
1792                5987 ;>              HeadPtr     : BYTE { !r0 }
1792                5988 ;>              ArrayPtr    : Ptr { !!r2 } { ptr to location in array }
1792                5989 ;>
1792                5990 ;>      Algorithm:
1792                5991 ;>
1792                5992 ;>      BEGIN
1792                5993 ;>       HeadPtr :=  SegPtrArray[ LogicalBlockNumber/bits 10:16 ]
1792                5994 ;>       Get_HeadPtr := NOT( HeadPtr.Nil )
1792                5995 ;>      END
1792                5996 ;>
1792                5997 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1792                5998                 .LSTOFF
1792                6001                 .LSTON






























        WIDGET.ASSEM            Page 183
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1792                6002                 .Page
1792                6003                 .FIN
1792                6004 
1792                6005 Get_HeadPtr:    
1792 18 ED        6 6006                 Ld      !r1,!rD         ;bits 8:15 of logical block #
1794 56 E1 FC    10 6007                 And     !r1,#$FC
1797 08 EC        6 6008                 Ld      !r0,!rC         ;bit 16 of logical block #
1799 C0 E0        6 6009                 Rrc     !r0             ;put bit 16 into carry flag
179B C0 E1        6 6010                 Rrc     !r1             ;shift bits 10:16 into !r1
179D CF           6 6011                 Rcf                     ;arithmetic divide by 2
179E C0 E1        6 6012                 Rrc     !r1
17A0                6013                 
17A0 2C 14        6 6014                 Ld      !r2,#.HIBYTE. SegPtrArray
17A2 3C C5        6 6015                 Ld      !r3,#.LOWBYTE. SegPtrArray
17A4 02 31        6 6016                 Add     !r3,!r1         ;add in offset to array
17A6 16 E2 00    10 6017                 Adc     !r2,#0
17A9 82 02       12 6018                 Lde     !r0,@!!r2       ;load HeadPtr
17AB                6019                 
17AB 66 E0 80    10 6020                 Tcm     !r0,#Nil        ;test for Nil Ptr
17AE AF          14 6021                 Ret
17AF                6022                 
17AF                6023                 .LSTOFF
17AF                6025                 .LSTON




































        WIDGET.ASSEM            Page 184
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


17AF                6026                 .Page
17AF                6027 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
17AF                6028 ;>
17AF                6029 ;>      Function: Get_EoList { Get End-Of-List }
17AF                6030 ;>
17AF                6031 ;>      This function takes a starting ptr as an input parameter
17AF                6032 ;>      and follows the list specified by the ptr until the list
17AF                6033 ;>      terminates. A pointer to the last element of the array is returned
17AF                6034 ;>      to the caller.
17AF                6035 ;>
17AF                6036 ;>      Inputs:
17AF                6037 ;>              Start_Ptr : BYTE { !r0 }
17AF                6038 ;>
17AF                6039 ;>      Outputs:
17AF                6040 ;>              Ptr : PTR { !!r2 }
17AF                6041 ;>              SparePtr : BYTE { !r0 }
17AF                6042 ;>              Element.Status : BYTE { !r1 }
17AF                6043 ;>              PreviousPtr : PTR { ScrReg0,1 }
17AF                6044 ;>
17AF                6045 ;>      Algorithm:
17AF                6046 ;>
17AF                6047 ;>      BEGIN
17AF                6048 ;>       Ptr := Get_Ptr( Start_Ptr )
17AF                6049 ;>       WHILE NOT( Get_Ptr( Temp )^.Nil ) DO
17AF                6050 ;>              PreviousPtr := Get_Ptr( Temp )
17AF                6051 ;>              Temp := PreviuosPtr^.Ptr
17AF                6052 ;>              Ptr := Get_Ptr( Temp )
17AF                6053 ;>              Element.Status := Ptr^.Status
17AF                6054 ;>      END
17AF                6055 ;>
17AF                6056 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
17AF                6057                 .LSTOFF
17AF                6060                 .LSTON


























        WIDGET.ASSEM            Page 185
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


17AF                6061                 .Page
17AF                6062                 .FIN
17AF                6063                 
17AF 09 43        6 6064 Get_EoList:     Ld      ScrReg3,!r0
17B1 D6 18 04    20 6065                 Call    Get_Ptr         ;create ptr into Spare Table
17B4 82 12       12 6066                 Lde     !r1,@!!r2       ;get element status
17B6 76 E1 80    10 6067                 Tm      !r1,#Nil        ;IF Nil THEN Exit Loop
17B9 EB 0E          6068                 Jr      Nz,EoList_End
17BB                6069                 
17BB 29 40        6 6070                 Ld      ScrReg0,!r2     ;save Ptr to element i - 1
17BD 39 41        6 6071                 Ld      ScrReg1,!r3
17BF 06 E3 03    10 6072                 Add     !r3,#3  ;get ptr to next
17C2 16 E2 00    10 6073                 Adc     !r2,#0
17C5 82 02       12 6074                 Lde     !r0,@!!r2
17C7 8B E6          6075                 Jr      Get_EoList
17C9                6076                 
17C9 AF          14 6077 EoList_End:     Ret
17CA                6078                 
17CA                6079                 .LSTOFF
17CA                6081                 .LSTON







































        WIDGET.ASSEM            Page 186
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


17CA                6082                 .Page
17CA                6083 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
17CA                6084 ;>
17CA                6085 ;>      Function: TSC_BitMap  { Test, Set, Or Clear BitMap Location }
17CA                6086 ;>
17CA                6087 ;>      This function performs one of 3 functions: Set a bit location
17CA                6088 ;>      in the Spare Table bit map; Clear a location in the Spare Table
17CA                6089 ;>      bit map; or Test a location in the spare table bit map. The
17CA                6090 ;>      location to test, set, or clear is an integer value between 0
17CA                6091 ;>      and 75.
17CA                6092 ;>
17CA                6093 ;>      Inputs:
17CA                6094 ;>              TestBit : BOOLEAN {!rC/bit 7 }
17CA                6095 ;>              SetBit  : BOOLEAN {!rC/bit 6 }
17CA                6096 ;>              ClearBit : BOOLEAN {!rC/bit 5 }
17CA                6097 ;>              Location : BYTE {!rD }
17CA                6098 ;>
17CA                6099 ;>      Outputs:
17CA                6100 ;>              TSC_BitMap : BOOLEAN { zero is set if location is zero }
17CA                6101 ;>
17CA                6102 ;>      Global Variables Changed:
17CA                6103 ;>              SpareBitMap
17CA                6104 ;>
17CA                6105 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
17CA                6106                 .LSTOFF
17CA                6109                 .LSTON

































        WIDGET.ASSEM            Page 187
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


17CA                6110                 .Page
17CA                6111                 .FIN
17CA                6112 
17CA 08 ED        6 6113 TSC_BitMap:     Ld      !r0,!rD
17CC                6114                 
17CC 3C 03        6 6115                 Ld      !r3,#3   ;right hand justify the byte index
17CE CF           6 6116 TSC_Lp1:        Rcf
17CF C0 E0        6 6117                 Rrc     !r0
17D1 3A FB          6118                 Djnz    !r3,TSC_Lp1
17D3                6119                 
17D3 2C 15        6 6120                 Ld      !r2,#.HIBYTE. SpareBitMap
17D5 3C 47        6 6121                 Ld      !r3,#.LOWBYTE. SpareBitMap
17D7 02 30        6 6122                 Add     !r3,!r0
17D9 16 E2 00    10 6123                 Adc     !r2,#0  ;inc second byte of address if needed
17DC 82 12       12 6124                 Lde     !r1,@!!r2 ;load in the byte from bit map
17DE                6125                 
17DE 56 ED 07    10 6126                 And     !rD,#$07 ;mask off all but MOD 8 of original index
17E1 0C 80        6 6127                 Ld      !r0,#$80 ;convert index to mask
17E3 6B 04          6128                 Jr      Z,TSC_Map
17E5                6129                 
17E5 E0 E0        6 6130 TSC_Lp2:        Rr      !r0
17E7 DA FC          6131                 Djnz    !rD,TSC_Lp2
17E9 70 E0          6132 TSC_Map:        Push    !r0     ;save mask
17EB                6133                 
17EB 76 EC 80    10 6134                 Tm      !rC,#TestBitMap
17EE EB 0F          6135                 Jr      Nz,TSC_End
17F0 76 EC 40    10 6136                 Tm      !rC,#SetBitMap
17F3 EB 06          6137                 Jr      Nz,TSC_Set
17F5                6138                 
17F5 60 E0        6 6139 TSC_Clear:      Com     !r0
17F7 52 10        6 6140                 And     !r1,!r0 ;mask out bit
17F9 8B 02          6141                 Jr      TSC_SCEnd
17FB                6142                 
17FB 42 10        6 6143 TSC_Set:        Or      !r1,!r0 ;merge in bit
17FD 92 12       12 6144 TSC_SCEnd:      Lde     @!!r2,!r1 ;update the bit map
17FF 50 E0       10 6145 TSC_End:        Pop     !r0
1801 72 10        6 6146                 Tm      !r1,!r0 ;test the bit
1803 AF          14 6147                 Ret
1804                6148                 
1804                6149                 .LSTOFF
1804                6151                 .LSTON


















        WIDGET.ASSEM            Page 188
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1804                6152                 .Page
1804                6153 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1804                6154 ;>
1804                6155 ;>      Function: Get_Ptr
1804                6156 ;>
1804                6157 ;>      This function accepts a Spare Table ptr structure and creates
1804                6158 ;>      a real ptr into the Spare Table array.
1804                6159 ;>
1804                6160 ;>      Inputs:
1804                6161 ;>              SparePtr : BYTE { !r0 }
1804                6162 ;>
1804                6163 ;>      Outputs:
1804                6164 ;>              SParePtr : BYTE { !r0 } { input is unchanged }
1804                6165 ;>              Ptr : PTR { !!r2 }
1804                6166 ;>
1804                6167 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1804                6168                 .LSTOFF
1804                6171                 .LSTON









































        WIDGET.ASSEM            Page 189
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1804                6172                 .Page
1804                6173                 .FIN
1804                6174                 
1804 2C 15        6 6175 Get_Ptr:        Ld      !r2,#.HIBYTE. Sparetable
1806 3C 51        6 6176                 Ld      !r3,#.LOWBYTE. SpareTable
1808                6177                 
1808 70 E0          6178                 Push    !r0 ;save structure ptr
180A 18 E0        6 6179                 Ld      !r1,!r0
180C B0 E0        6 6180                 Clr     !r0
180E 02 11        6 6181                 Add     !r1,!r1 ; !!r0 := 4 * !r1
1810 02 11        6 6182                 Add     !r1,!r1
1812 16 E0 00    10 6183                 Adc     !r0,#0
1815 02 31        6 6184                 Add     !r3,!r1         ;add offset into table
1817 12 20        6 6185                 Adc     !r2,!r0
1819 50 E0       10 6186                 Pop     !r0 ;get original structure ptr back
181B 8D 04 F8       6187                 Jp      Bank_Ret
181E                6188                 
181E                6189                 .LSTOFF
181E                6191                 .LSTON








































        WIDGET.ASSEM            Page 190
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


181E                6192                 .Page
181E                6193 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
181E                6194 ;>
181E                6195 ;>      Function: Get_Spr_Code
181E                6196 ;>
181E                6197 ;>      This function returns the SpareCode portion of BlkStat
181E                6198 ;>
181E                6199 ;>      Inputs: { none }
181E                6200 ;>
181E                6201 ;>      Outputs:
181E                6202 ;>              Get_Spr_Code: 2 BITS { !r0/Bits 1:0 }
181E                6203 ;>
181E                6204 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
181E                6205                 .LSTOFF
181E                6208                 .LSTON












































        WIDGET.ASSEM            Page 191
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


181E                6209                 .Page
181E                6210                 .FIN
181E                6211 
181E                6212 Get_Spr_Code:
181E 08 5A        6 6213                 Ld      !r0,BlkStat
1820 56 E0 03    10 6214                 And     !r0,#03 ;mask off all but SpareCode portion
1823 AF          14 6215                 Ret
1824                6216                 
1824                6217                 .LSTOFF
1824                6222                 .LSTON

















































        WIDGET.ASSEM            Page 192
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1824                6223                 .Page
1824                6224 ;>>>>>>>>>>>>>>>>>>>>>>>>
1824                6225 ;>
1824                6226 ;>      Module: Command_Driver 0
1824                6227 ;>
1824                6228 ;>      This module controls the way in which commands received by
1824                6229 ;>      the Host are executed. It's main responsibility is to determine
1824                6230 ;>      whether a command string is protected by a check byte ( the
1824                6231 ;>      original Profile commands are not ) and then decode the command
1824                6232 ;>      and pass control over to the correct driver routine to
1824                6233 ;>      execute the command. All exception handling at this level is
1824                6234 ;>      controlled by the individual command routines.
1824                6235 ;>
1824                6236 ;>      PORCEDURE Read_ID
1824                6237 ;>      PROCEDURE Read_SprTbl
1824                6238 ;>      PROCEDURE Pro_Write
1824                6239 ;>      FUNCTION Wr_Common : BOOLEAN
1824                6240 ;>      PROCEDURE Pro_WrVer
1824                6241 ;>      FUNCTION WrVer_Common : BOOLEAN
1824                6242 ;>
1824                6243 ;>>>>>>>>>>>>>>>>>>>>>>>>
1824                6244                 .LSTOFF
1824                6247                 .LSTON




































        WIDGET.ASSEM            Page 193
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1824                6248                 .Page
1824                6249 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1824                6250 ;>
1824                6251 ;>      Procedure: Read_ID
1824                6252 ;>
1824                6253 ;>      This procedure is responsible for letting the host system
1824                6254 ;>      know what type of device it is talking to.
1824                6255 ;>
1824                6256 ;>      Inputs: { none }
1824                6257 ;>
1824                6258 ;>      Output: { none }
1824                6259 ;>
1824                6260 ;>      Algorithm:
1824                6261 ;>
1824                6262 ;>      BEGIN
1824                6263 ;>       ClrNormStat
1824                6264 ;>       Zero_RdBuf
1824                6265 ;>       ID.DeviceName := DeviceName
1824                6266 ;>       ID.DeviceNumber := DeviceNumber
1824                6267 ;>       ID.Revision := RevisionNumber
1824                6268 ;>       ID.Capacity := Capacity
1824                6269 ;>       ID.BlockSize := BlockSize
1824                6270 ;>       Move4( StatusArray, Status )
1824                6271 ;>       Goto Rd_Leave
1824                6272 ;>      END
1824                6273 ;>
1824                6274 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1824                6275                 .LSTOFF
1824                6278                 .LSTON






























        WIDGET.ASSEM            Page 194
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1824                6279                 .Page
1824                6280                 .FIN
1824                6281                 
1824                6282 D_Read_ID:
1824 D6 1E 89    20 6283                 Call    ClrNormStat
1827 E6 0A 02    10 6284                  Ld     Wrk_Io+$A,#D_R_ID_Response
182A D6 03 02    20 6285                 Call    Ack_Read
182D                6286 
182D 2C 20        6 6287 Read_ID:         Ld     !r2,#.HIBYTE. Zero_RdBuf
182F 3C AC        6 6288                  Ld     !r3,#.LOWBYTE. Zero_RdBuf
1831 D6 04 AB    20 6289                 Call    Bank_Call
1834                6290                 
1834 CC 10        6 6291                 Ld      !rC,#.HIBYTE. RBuffer1
1836 DC 19        6 6292                 Ld      !rD,#.LOWBYTE. RBuffer1
1838 EC 10        6 6293                 Ld      !rE,#.HIBYTE. DeviceParams
183A FC A7        6 6294                 Ld      !rF,#.LOWBYTE. DeviceParams
183C 1C 1E        6 6295                 Ld      !r1,#Dev_Parm_Length
183E                6296                 
183E C2 0E       12 6297 Read_ID_Lp:     Ldc     !r0,@!!rE
1840 92 0C       12 6298                 Lde     @!!rC,!r0
1842 A0 EC       10 6299                 Incw    !!rC
1844 A0 EE       10 6300                 Incw    !!rE
1846 1A F6          6301                 Djnz    !r1,Read_ID_Lp
1848                6302                 
1848 B0 E0        6 6303                 Clr     !r0
184A B0 E1        6 6304                 Clr     !r1
184C                6305                 
184C EC 15        6 6306                  Ld     !rE,#.HIBYTE. SprCount
184E FC 45        6 6307                  Ld     !rF,#.LOWBYTE. SprCount
1850 82 2E       12 6308                  Lde    !r2,@!!rE ;get SpareCount
1852 D6 18 6A    20 6309                 Call    MoveI_3
1855                6310                 
1855 A0 EE       10 6311                  Incw   !!rE ;point to BadBlock count
1857 82 2E       12 6312                  Lde    !r2,@!!rE
1859 D6 18 6A    20 6313                 Call    MoveI_3
185C                6314                 
185C 2C 14        6 6315                  Ld     !r2,#.HIBYTE. FmtOffset
185E 3C C3        6 6316                  Ld     !r3,#.LOWBYTE. FmtOffset
1860 E8 EC        6 6317                  Ld     !rE,!rC
1862 F8 ED        6 6318                  Ld     !rF,!rD
1864 D6 1E BD    20 6319                 Call    Move4_B0
1867                6320                 
1867 8D 12 CA       6321                 Jp      Rd_Leave
186A                6322                 
186A 3C 03        6 6323 MoveI_3:        Ld      !r3,#3 ;move 3 bytes
186C 48 FD        6 6324                 Ld      !r4,Rp
186E 93 4C       18 6325 MoveI_3_Lp:     Ldei    @!!rC,@!r4
1870 3A FC          6326                 Djnz    !r3,MoveI_3_Lp
1872 AF          14 6327                 Ret
1873                6328                 
1873                6329                 .LSTOFF
1873                6331                 .LSTON







        WIDGET.ASSEM            Page 195
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1873                6332                 .Page
1873                6333 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1873                6334 ;>
1873                6335 ;>      Procedure: Read_SprTbl
1873                6336 ;>
1873                6337 ;>      This procedure is responsible for passing the spare
1873                6338 ;>      table on to the host. Note that this information is
1873                6339 ;>      sent in it's raw form and that it is up to the host
1873                6340 ;>      to correctly interpret it.
1873                6341 ;>
1873                6342 ;>      Inputs: { none }
1873                6343 ;>
1873                6344 ;>      Output: { none }
1873                6345 ;>
1873                6346 ;>      Algorithm:
1873                6347 ;>
1873                6348 ;>      BEGIN
1873                6349 ;>       RBuffer1 := SpareArray
1873                6350 ;>       Move4( StatusArray, Status )
1873                6351 ;>       Clr_Bsy( StatusArray )
1873                6352 ;>      END
1873                6353 ;>
1873                6354 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1873                6355                 .LSTOFF
1873                6358                 .LSTON


































        WIDGET.ASSEM            Page 196
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1873                6359                 .Page
1873                6360                 .FIN
1873                6361                 
1873                6362 D_Read_SprTbl:
1873 D6 1E 89    20 6363                 Call    ClrNormStat
1876 E6 0A 0F    10 6364                 Ld      Wrk_Io+$A,#D_R_Spr_Response
1879 D6 03 02    20 6365                 Call    Ack_Read
187C                6366 
187C 2C 20        6 6367 Read_SprTbl:     Ld     !r2,#.HIBYTE. Spr_To_RBuf
187E 3C 75        6 6368                  Ld     !r3,#.LOWBYTE. Spr_To_RBuf
1880 D6 04 AB    20 6369                 Call    Bank_Call
1883                6370                 
1883 8D 12 CA       6371                 Jp      Rd_Leave
1886                6372                 
1886                6373                 .LSTOFF
1886                6375                 .LSTON











































        WIDGET.ASSEM            Page 197
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1886                6376                 .Page
1886                6377 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1886                6378 ;>
1886                6379 ;>      Procedure: Pro_Write
1886                6380 ;>
1886                6381 ;>      This procedure emulates the ProFile Write command
1886                6382 ;>
1886                6383 ;>      Inputs: { none }
1886                6384 ;>
1886                6385 ;>      Outputs: { none }
1886                6386 ;>
1886                6387 ;>      Algorithm:
1886                6388 ;>
1886                6389 ;>      BEGIN
1886                6390 ;>       ClrNormStat
1886                6391 ;>       LoadLogicalBlock( Pro_Log_Offset )
1886                6392 ;>       Get_Type( Widget ) { check logical block bounds }
1886                6393 ;>       Seek_Type := Access_Offset
1886                6394 ;>       OverLap( User_Type, Write_Op, Write_Response, BlockNumber, 0 )
1886                6395 ;>       IF ( BlkStat.SprCode = BadBlock )
1886                6396 ;>        THEN
1886                6397 ;>              BlockMove( Buf2Array, WBuffer1-1 )
1886                6398 ;>              Data_Ex_Handler( SpareBlock )
1886                6399 ;>        ELSE
1886                6400 ;>         IF NOT( Wr_Common )
1886                6401 ;>          THEN Data_Ex_Handler( Wr_Common.ErrorCode )
1886                6402 ;>       Rd_Leave
1886                6403 ;>      END
1886                6404 ;>
1886                6405 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1886                6406                 .LSTOFF
1886                6409                 .LSTON



























        WIDGET.ASSEM            Page 198
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1886                6410                 .Page
1886                6411                 .FIN
1886                6412 
1886                6413 Pro_Write:
1886 E6 0A 03    10 6414                  Ld     Wrk_Io+$A,#Wr_Response
1889 D6 18 A1    20 6415                 Call    Pro_Wr_SetUp
188C                6416                 
188C 76 5A 02    10 6417                 Tm      BlkStat,#B_Block ;IF BadBlock
188F 6B 05          6418                 Jr      Z,ProWr_1
1891                6419                 
1891 D6 18 CE    20 6420 Pro_Wr_BB:      Call    Wr_BBlock
1894 8B 08          6421                 Jr      Wr_Leave
1896                6422                 
1896 D6 18 DB    20 6423 ProWr_1:        Call    Wr_Common
1899 EB 03          6424 Pro_Wr_Exit:    Jr      Nz,Wr_Leave
189B                6425                 
189B D6 16 BD    20 6426                 Call    Data_Ex_Handler
189E                6427                 
189E 8D 12 CA       6428 Wr_Leave:       Jp      Rd_Leave
18A1                6429                 







































        WIDGET.ASSEM            Page 199
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


18A1                6430                 .Page
18A1                6431                 
18A1 D6 1E 89    20 6432 Pro_Wr_SetUp:   Call    ClrNormStat
18A4                6433                 
18A4 D6 02 ED    20 6434                 Call    Get_Wr_Data
18A7                6435                 
18A7 0C 01        6 6436                  Ld     !r0,#Pro_Log_Offset
18A9 D6 06 4E    20 6437                 Call    Ld_LgclBlk ;LogicalBlockNumber := ...
18AC                6438                 
18AC 8C 01        6 6439                  Ld     !r8,#Widget
18AE 2C 21        6 6440                  Ld     !r2,#.HIBYTE. Get_Type
18B0 3C A1        6 6441                  Ld     !r3,#.LOWBYTE. Get_Type
18B2 D6 04 AB    20 6442                 Call    Bank_Call ;check block bounds
18B5                6443                 
18B5 E6 57 90    10 6444                 Ld      Seek_Type,#Access_Offset
18B8 E6 58 02    10 6445                 Ld      Data_Type,#User_Type
18BB 46 56 20    10 6446                 Or      DiskStat,#Wr_Op
18BE                6447                 
18BE 2C 26        6 6448                  Ld     !r2,#.HIBYTE. OverLap
18C0 3C 06        6 6449                  Ld     !r3,#.LOWBYTE. OverLap
18C2 D6 04 AB    20 6450                 Call    Bank_Call
18C5                6451                 
18C5 76 56 01    10 6452                 Tm      DiskStat,#Offset_On
18C8 EB 03          6453                 Jr      Nz,P_W_S_End
18CA                6454                 
18CA D6 05 CA    20 6455                 Call    ReSeek
18CD                6456                 
18CD AF          14 6457 P_W_S_End:      Ret
18CE                6458 
18CE                6459 ;*********************************
18CE                6460 
18CE 2C 20        6 6461 Wr_BBlock:       Ld     !r2,#.HIBYTE. WrBuf_To_Buf2
18D0 3C 65        6 6462                  Ld     !r3,#.LOWBYTE. WrBuf_To_Buf2
18D2 D6 04 AB    20 6463                 Call    Bank_Call
18D5                6464                  
18D5 0C 82        6 6465                  Ld     !r0,#Error+Ex_SprBlock
18D7 D6 16 BD    20 6466                 Call    Data_Ex_Handler
18DA AF          14 6467                 Ret
18DB                6468                 
18DB                6469                 .LSTOFF
18DB                6471                 .LSTON


















        WIDGET.ASSEM            Page 200
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


18DB                6472                 .Page
18DB                6473 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
18DB                6474 ;>
18DB                6475 ;>      Function: Wr_Common
18DB                6476 ;>
18DB                6477 ;>      This function handles all of the write specific details
18DB                6478 ;>      for all of Widget's write commands.
18DB                6479 ;>
18DB                6480 ;>      Inputs: { none }
18DB                6481 ;>
18DB                6482 ;>      Outputs:
18DB                6483 ;>              Wr_Common : BOOLEAN { zero flag is set if data exception }
18DB                6484 ;>              ErrorCode.Error : BOOLEAN { !r0/Bit 7 }
18DB                6485 ;>              ErrorCode.Type : 7 BITS { !r0/Bits 6:0 }
18DB                6486 ;>
18DB                6487 ;>      Local Variables:
18DB                6488 ;>              Retry        : BYTE { !r5 }
18DB                6489 ;>              ErrorCode    : BYTE { !r4 }
18DB                6490 ;>
18DB                6491 ;>      Algorithm:
18DB                6492 ;>
18DB                6493 ;>      BEGIN
18DB                6494 ;>       ErrorCode.Error := False
18DB                6495 ;>       IF NOT( WriteBlock )
18DB                6496 ;>        THEN
18DB                6497 ;>         ErrorCode.Error := True
18DB                6498 ;>         ErrorCode.Type := Undetermined
18DB                6499 ;>         IF Recovery
18DB                6500 ;>            THEN
18DB                6501 ;>                IF ServoError OR NoHeaderFound
18DB                6502 ;>                 THEN
18DB                6503 ;>                   ErrorCode.Error := False
18DB                6504 ;>                   Retry := 4
18DB                6505 ;>                   REPEAT
18DB                6506 ;>                     THEN
18DB                6507 ;>                           ServoRecovery
18DB                6508 ;>                           Retry := Retry - 1
18DB                6509 ;>                   UNTIL NOT( Retry = 0 ) OR WriteBlock
18DB                6510 ;>                  IF NOT( WriteBlock )
18DB                6511 ;>                   THEN
18DB                6512 ;>                       ErrorCode.Error := True
18DB                6513 ;>                       ErrorCode.Type := Undetermined
18DB                6514 ;>                  IF ServoError
18DB                6515 ;>                   THEN
18DB                6516 ;>                        SetStatus( Byte0, Status_ServoError )
18DB                6517 ;>                        Abort
18DB                6518 ;>                  IF NoHeaderFound
18DB                6519 ;>                   THEN 
18DB                6520 ;>                       MoveBlock( Buffer2, WriteBuffer )
18DB                6521 ;>                       ErrorCode.Type := SpareBlock
18DB                6522 ;>       Write_Common := NOT( ErrorCode.Error )
18DB                6523 ;>      END
18DB                6524 ;>
18DB                6525 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>





        WIDGET.ASSEM            Page 201
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


18DB                6526                 .LSTOFF
18DB                6529                 .LSTON

























































        WIDGET.ASSEM            Page 202
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


18DB                6530                 .Page
18DB                6531                 .FIN
18DB                6532 
18DB                6533 Wr_Common:
18DB E6 42 12    10 6534                  Ld     ScrReg2,#.HIBYTE. WBlkFence ;check for host overflow
18DE E6 43 70    10 6535                  Ld     ScrReg3,#.LOWBYTE. WBlkFence
18E1 2C 24        6 6536                  Ld     !r2,#.HIBYTE. Chk_PassWord
18E3 3C E6        6 6537                  Ld     !r3,#.LOWBYTE. Chk_PassWord
18E5 D6 04 AB    20 6538                 Call    Bank_Call
18E8 EB 0A          6539                 Jr      Nz,Wr_Cmn_Ok
18EA                6540                 
18EA 0C 00        6 6541                  Ld     !r0,#0 ;byte zero
18EC 1C 40        6 6542                  Ld     !r1,#WrBuf_OR ;buffer over run
18EE D6 04 03    20 6543                 Call    SetStatus
18F1 D6 05 1F    20 6544                 Call    Abort
18F4                6545                 
18F4 70 E4          6546 Wr_Cmn_Ok:      Push    !r4
18F6                6547 
18F6 46 56 20    10 6548                 Or      DiskStat,#Wr_Op
18F9 B0 E4        6 6549                 Clr     !r4
18FB D6 1D E2    20 6550                 Call    WriteBlock
18FE EB 3F          6551                 Jr      Nz,Wr_Cmn_End
1900                6552                 
1900 2C 20        6 6553                  Ld     !r2,#.HIBYTE. WrBuf_To_Buf2
1902 3C 65        6 6554                  Ld     !r3,#.LOWBYTE. WrBuf_To_Buf2
1904 D6 04 AB    20 6555                 Call    Bank_Call
1907                6556                 
1907 4C 80        6 6557                 Ld      !r4,#Error ;ErrorCode := Error, Undetermined
1909                6558                 
1909 76 24 80    10 6559                 Tm      Excpt_Stat,#Recovery ;IF Recovery THEN ...
190C 6B 31          6560                 Jr      Z,Wr_Cmn_End
190E                6561                 
190E 5C 04        6 6562                 Ld      !r5,#4  ;Retry := 4
1910                6563                 
1910 2C 29        6 6564 Wr_Cmn_Lp:       Ld     !r2,#.HIBYTE. SrvoRcvry
1912 3C 0C        6 6565                  Ld     !r3,#.LOWBYTE. SrvoRcvry
1914 D6 04 AB    20 6566                 Call    Bank_Call
1917                6567                 
1917 2C 20        6 6568                  Ld     !r2,#.HIBYTE. Buf2_To_WrBuf
1919 3C 6B        6 6569                  Ld     !r3,#.LOWBYTE. Buf2_To_WrBuf
191B D6 04 AB    20 6570                 Call    Bank_Call
191E                6571                 
191E D6 1D E2    20 6572                 Call    WriteBlock
1921 B0 E4        6 6573                 Clr     !r4
1923 EB 1A          6574                 Jr      Nz,Wr_Cmn_End
1925                6575                 
1925 5A E9          6576                 Djnz    !r5,Wr_Cmn_Lp
1927 4C 80        6 6577                 Ld      !r4,#Error
1929                6578                 
1929 76 28 40    10 6579 Wr_Cmn_Servo:   Tm      WrStat,#WrSrvoErr
192C 6B 0A          6580                 Jr      Z,Wr_Cmn_Hdr
192E                6581                 
192E B0 E0        6 6582                  Clr    !r0 ;Byte 0
1930 1C 02        6 6583                  Ld     !r1,#Stat_Srvo





        WIDGET.ASSEM            Page 203
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1932 D6 04 03    20 6584                 Call    SetStatus
1935 D6 05 1F    20 6585                 Call    Abort
1938                6586                 
1938 76 28 10    10 6587 Wr_Cmn_Hdr:     Tm      WrStat,#WrNoHdrFnd
193B 6B 02          6588                 Jr      Z,Wr_Cmn_End
193D                6589                 
193D 4C 8A        6 6590                 Ld      !r4,#Error+Ex_HdrSpr
193F                6591                 
193F 08 E4        6 6592 Wr_Cmn_End:     Ld      !r0,!r4
1941 50 E4       10 6593                 Pop     !r4             ;retrieve register from stack
1943 66 E0 80    10 6594                 Tcm     !r0,#WrError
1946 8D 04 F8       6595                 Jp      Bank_Ret
1949                6596                 
1949                6597                 .LSTOFF
1949                6599                 .LSTON












































        WIDGET.ASSEM            Page 204
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1949                6600                 .Page
1949                6601 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1949                6602 ;>
1949                6603 ;>      Procedure: Pro_WrVer
1949                6604 ;>
1949                6605 ;>      This procedure emulates the ProFile Write/Verify
1949                6606 ;>      command.
1949                6607 ;>
1949                6608 ;>      Inputs: { none }
1949                6609 ;>
1949                6610 ;>      Outputs: { none }
1949                6611 ;>
1949                6612 ;>      Algorithm:
1949                6613 ;>
1949                6614 ;>      BEGIN
1949                6615 ;>       ClrNormStat
1949                6616 ;>       LoadLogicalBlock( Pro_Log_Offset )
1949                6617 ;>       Get_Type( Widget ) { check logical block bounds }
1949                6618 ;>       Seek_Type := Access_Offset
1949                6619 ;>       OverLap( User_Type, Write_Op, WrVer_Response, BlockNumber, 0 )
1949                6620 ;>       IF ( BlkStat.SprCode = BadBlock )
1949                6621 ;>        THEN
1949                6622 ;>              BlockMove( Buf2Array, WBuffer1-1 )
1949                6623 ;>              Data_Ex_Handler( SpareBlock )
1949                6624 ;>        ELSE
1949                6625 ;>         IF NOT( WrVer_Common )
1949                6626 ;>          THEN Data_Ex_Handler( WrVer_Common.ErrorCode )
1949                6627 ;>       Rd_Leave
1949                6628 ;>      END
1949                6629 ;>
1949                6630 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1949                6631                 .LSTOFF
1949                6634                 .LSTON


























        WIDGET.ASSEM            Page 205
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1949                6635                 .Page
1949                6636                 .FIN
1949                6637 
1949                6638 Sys_WrV:
1949 E6 0A 24    10 6639                  Ld     Wrk_Io+$A,#Sys_WrVer_Resp
194C 8B 00          6640                 Jr      Pro_WrVer_2
194E                6641 
194E                6642 Pro_WrVer:
194E E6 0A 04    10 6643                  Ld     Wrk_Io+$A,#WrVer_Response
1951 D6 18 A1    20 6644 Pro_WrV_2:      Call    Pro_Wr_SetUp
1954                6645 
1954 2C 20        6 6646                  Ld     !r2,#.HIBYTE. WrBuf_To_Buf2
1956 3C 65        6 6647                  Ld     !r3,#.LOWBYTE. WrBuf_To_Buf2
1958 D6 04 AB    20 6648                 Call    Bank_Call
195B                6649 
195B 76 5A 02    10 6650                 Tm      BlkStat,#B_Block ;IF BadBlock
195E 6B 05          6651                 Jr      Z,ProWrV_1
1960                6652                 
1960 D6 18 CE    20 6653                 Call    Wr_BBlock
1963 8B 08          6654                 Jr      WrVer_Leave
1965                6655                 
1965 D6 19 70    20 6656 ProWrV_1:       Call    WrVer_Common
1968 EB 03          6657                 Jr      Nz,WrVer_Leave
196A                6658                 
196A D6 16 BD    20 6659                 Call    Data_Ex_Handler
196D                6660                 
196D 8D 12 CA       6661 WrVer_Leave:    Jp      Rd_Leave
1970                6662 
1970                6663                 .LSTOFF
1970                6665                 .LSTON





























        WIDGET.ASSEM            Page 206
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1970                6666                 .Page
1970                6667 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1970                6668 ;>
1970                6669 ;>      Function: WrVer_Common
1970                6670 ;>
1970                6671 ;>      This function has the responsibility of making certain ( within
1970                6672 ;>      reasonable limits ) that when a block is written to the disk that
1970                6673 ;>      it can also be read back. WriteVerify comes in two flavors:
1970                6674 ;>      Conservative and NotConservative. The attempt here is to make
1970                6675 ;>      the WriteVerify routine attractive to end users as well as provide
1970                6676 ;>      a means for the controller to have a high degree of confidence
1970                6677 ;>      in writing some of it's more important blocks.
1970                6678 ;>
1970                6679 ;>      Inputs: { none }
1970                6680 ;>
1970                6681 ;>      Outputs:
1970                6682 ;>              WrVer_Common : BOOLEAN { zero flag set if operation failed }
1970                6683 ;>
1970                6684 ;>      Algorithm:
1970                6685 ;>
1970                6686 ;>      BEGIN
1970                6687 ;>        IF Wr_Common
1970                6688 ;>         THEN
1970                6689 ;>              DiskStat.Wr_Op := False
1970                6690 ;>              Rd_Common
1970                6691 ;>              IF ( Rd_Common.ErrorType = Ex_HdrBad )
1970                6692 ;>               THEN Rd_Common.ErrorType := Ex_HdrSpr
1970                6693 ;>               ELSE
1970                6694 ;>                IF ( Rd_Common.ErrorType = Ex_BadBlock )
1970                6695 ;>                 THEN Rd_Common.ErrorType := Ex_SprBlock
1970                6696 ;>      END
1970                6697 ;>
1970                6698 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1970                6699                 .LSTOFF
1970                6702                 .LSTON
























        WIDGET.ASSEM            Page 207
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1970                6703                 .Page
1970                6704                 .FIN
1970                6705 
1970                6706 WrVer_Common:
1970 D6 10 97    20 6707                 Call    ExtPush_Vector
1973                6708                 
1973 46 56 20    10 6709                 Or      DiskStat,#Wr_Op
1976 D6 18 DB    20 6710                 Call    Wr_Common
1979 6B 1D          6711                 Jr      Z,WrVer_Ret
197B                6712                 
197B 56 56 DF    10 6713                 And     DiskStat,#$FF-Wr_Op
197E D6 12 F2    20 6714                 Call    Read_Common
1981 EB 15          6715                 Jr      Nz,WrVer_Ret
1983                6716                 
1983 18 E0        6 6717                 Ld      !r1,!r0
1985 56 E1 7F    10 6718                 And     !r1,#$7F ;mask off error bit
1988                6719                 
1988 A6 E1 08    10 6720                 Cp      !r1,#Ex_HdrBad
198B 2C 8A        6 6721                 Ld      !r2,#Error+Ex_HdrSpr
198D 6B 07          6722                 Jr      Z,WrV_ChgEx
198F                6723                 
198F A6 E1 04    10 6724                 Cp      !r1,#Ex_BadBlock
1992 2C 82        6 6725                 Ld      !r2,#Error+Ex_SprBlock
1994 EB 02          6726                 Jr      Nz,WrVer_Ret
1996                6727                 
1996 08 E2        6 6728 WrV_Chg_Ex:     Ld      !r0,!r2
1998                6729                 
1998 70 E0          6730 WrVer_Ret:      Push    !r0
199A D6 10 9F    20 6731                 Call    ExtPop_Vector
199D 50 E0       10 6732                 Pop     !r0
199F 66 E0 80    10 6733                 Tcm     !r0,#Error ;set error condition
19A2 8D 04 F8       6734                 Jp      Bank_Ret
19A5                6735                 
19A5                6736                 .LSTOFF
19A5                6742                 .LSTON
























        WIDGET.ASSEM            Page 208
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


19A5                6743                 .Page
19A5                6744 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19A5                6745 ;>
19A5                6746 ;>      Module: Cmnd1  { continuation of the command processor module }
19A5                6747 ;>
19A5                6748 ;>      PROCEDURE D_Read
19A5                6749 ;>      PROCEDURE D_ReadHdr
19A5                6750 ;>      PROCEDURE D_Write
19A5                6751 ;>      PROCEDURE Read_CStatus
19A5                6752 ;>      PROCEDURE Read_SStatus
19A5                6753 ;>      PROCEDURE Send_ServoCmnd
19A5                6754 ;>      PROCEDURE Send_Seek
19A5                6755 ;>      PROCEDURE Send_Restore
19A5                6756 ;>      PROCEDURE Send_Park
19A5                6757 ;>      PROCEDURE Set_Ram_Addr
19A5                6758 ;>      PROCEDURE Wr_SprTbl
19A5                6759 ;>      PROCEDURE Format
19A5                6760 ;>      PROCEDURE Read_Abort
19A5                6761 ;>      PROCEDURE D_RstSrvo
19A5                6762 ;>      PROCEDURE D_InitSprTbl
19A5                6763 ;>
19A5                6764 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19A5                6765                 .LSTOFF
19A5                6768                 .LSTON



































        WIDGET.ASSEM            Page 209
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


19A5                6769                 .Page
19A5                6770 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19A5                6771 ;>
19A5                6772 ;>      Procedure: D_Read
19A5                6773 ;>
19A5                6774 ;>      This procedure is used by the Host to invoke the primitive
19A5                6775 ;>      read function. The block that is read by this routine is the
19A5                6776 ;>      last seek address ( cylinder, head, and sector ). It is
19A5                6777 ;>      best to turn recovery OFF before using this command - as it
19A5                6778 ;>      is when using ALL diagnostic commands.
19A5                6779 ;>
19A5                6780 ;>      Inputs: { none }
19A5                6781 ;>
19A5                6782 ;>      Outputs: { none }
19A5                6783 ;>
19A5                6784 ;>      Algorithm:
19A5                6785 ;>
19A5                6786 ;>      BEGIN
19A5                6787 ;>       ClrNormStat
19A5                6788 ;>       Ack_Read( D_Read_Response )
19A5                6789 ;>       IF NOT( Read_Common )
19A5                6790 ;>        THEN Data_Ex_Handler( Read_Common.ErrorCode )
19A5                6791 ;>       Rd_Leave
19A5                6792 ;>      END
19A5                6793 ;>
19A5                6794 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19A5                6795                 .LSTOFF
19A5                6798                 .LSTON































        WIDGET.ASSEM            Page 210
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


19A5                6799                 .Page
19A5                6800                 .FIN
19A5                6801 
19A5                6802 D_Read:
19A5 D6 1E 89    20 6803                 Call    ClrNormStat
19A8                6804                 
19A8 E6 0A 0B    10 6805                  Ld     Wrk_Io+$A,#D_Read_Response
19AB D6 03 02    20 6806                 Call    Ack_Read
19AE                6807                 
19AE E6 58 02    10 6808                 Ld      Data_Type,#User_Type
19B1 56 56 DF    10 6809                 And     DiskStat,#$FF-Wr_Op
19B4 D6 12 F2    20 6810                 Call    Read_Common
19B7 EB 05          6811                 Jr      Nz,D_Read_End
19B9                6812                 
19B9 0C 80        6 6813                  Ld     !r0,#Error
19BB D6 16 BD    20 6814                 Call    Data_Ex_Handler
19BE                6815                 
19BE 8D 12 CA       6816 D_Read_End:     Jp      Rd_Leave
19C1                6817                 
19C1                6818                 .LSTOFF
19C1                6820                 .LSTON






































        WIDGET.ASSEM            Page 211
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


19C1                6821                 .Page
19C1                6822 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19C1                6823 ;>
19C1                6824 ;>      Procedure: D_ReadHdr
19C1                6825 ;>
19C1                6826 ;>      This diagnostic command is used to read the header ( and whatever
19C1                6827 ;>      the contents may be ) of the block pointed to by the last seek 
19C1                6828 ;>      address. The host should be cautioned that the buffer that the
19C1                6829 ;>      controller points it to at the completion of the read is longer
19C1                6830 ;>      than a normal read buffer by the length of the header and the
19C1                6831 ;>      data gap.
19C1                6832 ;>
19C1                6833 ;>      Inputs: { none }
19C1                6834 ;>
19C1                6835 ;>      Outputs: { none }
19C1                6836 ;>
19C1                6837 ;>      Algorithm:
19C1                6838 ;>
19C1                6839 ;>      BEGIN
19C1                6840 ;>       ClrNormStat
19C1                6841 ;>       Ack_Read( D_RdHdr_Response )
19C1                6842 ;>       Sector := Ld_Param1.First
19C1                6843 ;>       LocateSector
19C1                6844 ;>       ReadHdr
19C1                6845 ;>       IF ReadHdr.ServoErr THEN SetStatus( Byte0, ServoEror )
19C1                6846 ;>       IF ReadHdr.CrcErr THEN SetStatus( Byte0, ReadError )
19C1                6847 ;>       Move4( RdHdrStatusArray, CStatus0 )
19C1                6848 ;>       Clr_Bsy( RdHdrStatusArray )
19C1                6849 ;>
19C1                6850 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19C1                6851                 .LSTOFF
19C1                6854                 .LSTON



























        WIDGET.ASSEM            Page 212
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


19C1                6855                 .Page
19C1                6856                 .FIN
19C1                6857 
19C1                6858 D_ReadHdr:
19C1 D6 1E 89    20 6859                 Call    ClrNormStat
19C4                6860                 
19C4 E6 0A 0C    10 6861                  Ld     Wrk_Io+$A,#D_RdHdr_Response
19C7 D6 03 02    20 6862                 Call    Ack_Read
19CA                6863                 
19CA D6 1A EF    20 6864                 Call    Ld_Param1
19CD                6865                 
19CD 09 55        6 6866                 Ld      Sector,!r0 ;load new sector
19CF 2C 11        6 6867                  Ld     !r2,#.HIBYTE. LocateSector
19D1 3C 24        6 6868                  Ld     !r3,#.LOWBYTE. LocateSector
19D3 D6 04 AB    20 6869                 Call    Bank_Call
19D6                6870                 
19D6 E6 58 02    10 6871                 Ld      Data_Type,#User_Type
19D9 56 56 DF    10 6872                 And     DiskStat,#$FF-Wr_Op
19DC                6873                 
19DC 2C 20        6 6874                  Ld     !r2,#.HIBYTE. ReadHdr
19DE 3C 07        6 6875                  Ld     !r3,#.LOWBYTE. ReadHdr
19E0 D6 04 AB    20 6876                 Call    Bank_Call
19E3                6877                 
19E3 70 E0          6878                 Push    !r0 ;save status byte
19E5                6879                 
19E5 76 E0 40    10 6880                 Tm      !r0,#RdHSrvoErr ;IF ReadHdr.ServoErr
19E8 6B 07          6881                 Jr      Z,D_RdH_Crc
19EA                6882                 
19EA B0 E0        6 6883                  Clr    !r0 ;byte0
19EC 1C 02        6 6884                  Ld     !r1,#Stat_Srvo
19EE D6 04 03    20 6885                 Call    SetStatus
19F1                6886                 
19F1 50 E0       10 6887 D_RdH_Crc:      Pop     !r0
19F3 76 E0 08    10 6888                 Tm      !r0,#RdCrcErr
19F6 6B 07          6889                 Jr      Z,D_RdH_End
19F8                6890                 
19F8 B0 E0        6 6891                  Clr    !r0 ;byte 0
19FA 1C 08        6 6892                  Ld     !r1,#Stat_Rd_Err
19FC D6 04 03    20 6893                 Call    SetStatus
19FF                6894                 
19FF 2C 14        6 6895 D_RdH_End:       Ld     !r2,#.HIBYTE. CStatus0
1A01 3C 95        6 6896                  Ld     !r3,#.LOWBYTE. CStatus0
1A03 EC 10        6 6897                  Ld     !rE,#.HIBYTE. RdH_Stat_Array
1A05 FC 08        6 6898                  Ld     !rF,#.LOWBYTE. RdH_Stat_Array
1A07 D6 1E BD    20 6899                 Call    Move4_B0
1A0A                6900                 
1A0A 31 00        6 6901                 Srp    #Wrk_Io
1A0C AC 01        6 6902                  Ld     !rA,#Init_Response
1A0E B0 EB        6 6903                  Clr    !rB
1A10 CC 10        6 6904                  Ld     !rC,#.HIBYTE. RdH_Stat_Array
1A12 DC 08        6 6905                  Ld     !rD,#.LOWBYTE. RdH_Stat_Array
1A14 8D 02 5F       6906                 Jp      Clr_Bsy
1A17                6907                 
1A17                6908                 .LSTOFF





        WIDGET.ASSEM            Page 213
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1A17                6910                 .LSTON


























































        WIDGET.ASSEM            Page 214
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1A17                6911                 .Page
1A17                6912 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1A17                6913 ;>
1A17                6914 ;>      Procedure: D_Write
1A17                6915 ;>
1A17                6916 ;>      This procedure, like D_Read, allows the host to perform
1A17                6917 ;>      a single write to the last seek address. KEEP IN MIND THAT
1A17                6918 ;>      THIS ROUTINE WILL ALLOW YOU TO WRITE ANYWHERE ON THE DISK THAT
1A17                6919 ;>      YOU CARE TO WRITE!!!!
1A17                6920 ;>
1A17                6921 ;>      Inputs: { none }
1A17                6922 ;>
1A17                6923 ;>      Outputs: { none }
1A17                6924 ;>
1A17                6925 ;>      Algorithm:
1A17                6926 ;>
1A17                6927 ;>      BEGIN
1A17                6928 ;>       ClrNormStat
1A17                6929 ;>       Get_Wr_Data( D_Write_Response )
1A17                6930 ;>       IF NOT( Write_Common )
1A17                6931 ;>        THEN Data_Ex_Handler( Wr_Common.ErrorCode )
1A17                6932 ;>       Rd_Leave
1A17                6933 ;>      END
1A17                6934 ;>
1A17                6935 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1A17                6936                 .LSTOFF
1A17                6939                 .LSTON
































        WIDGET.ASSEM            Page 215
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1A17                6940                 .Page
1A17                6941                 .FIN
1A17                6942 
1A17                6943 D_Write:
1A17 D6 1E 89    20 6944                 Call    ClrNormStat
1A1A                6945                 
1A1A E6 58 02    10 6946                 Ld      Data_Type,#User_Type
1A1D 46 56 20    10 6947                 Or      DiskStat,#Wr_Op
1A20                6948                 
1A20 E6 0A 0D    10 6949                  Ld     Wrk_Io+$A,#D_Write_Response
1A23 D6 02 ED    20 6950                 Call    Get_Wr_Data
1A26                6951                 
1A26 D6 18 DB    20 6952                 Call    Wr_Common
1A29 EB 05          6953                 Jr      Nz,D_Write_End
1A2B                6954                 
1A2B 0C 80        6 6955                  Ld     !r0,#Error
1A2D D6 16 BD    20 6956                 Call    Data_Ex_Handler
1A30                6957                 
1A30 8D 12 CA       6958 D_Write_End:    Jp      Rd_Leave
1A33                6959                 
1A33                6960                 .LSTOFF
1A33                6962                 .LSTON





































        WIDGET.ASSEM            Page 216
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1A33                6963                 .Page
1A33                6964 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1A33                6965 ;>
1A33                6966 ;>      Procedure: Read_CStatus
1A33                6967 ;>
1A33                6968 ;>      This procedure allows the host to read any of the controllers
1A33                6969 ;>      status'. These status' all come in 4 byte quantities:
1A33                6970 ;>      
1A33                6971 ;>      Status0: Standard_Status { sent to the host at the completion
1A33                6972 ;>                                 of a command - note that a request
1A33                6973 ;>                                 for status is NOT a command }
1A33                6974 ;>      Status1: Last_Logical_Block { 0, HiByte, MidByte, LoByte }
1A33                6975 ;>      Status2: Last_Seek_Address { HiCylinder, LoCylinder, Head, Sector }
1A33                6976 ;>      Status3: Current_Cylinder { HiCylinder, LoCylinder, 0, 0 }
1A33                6977 ;>      Status4: Internal_Stat { Excpt_Stat, DiskStat, BlkStat, 0 }
1A33                6978 ;>      Status5: Cntrl_Port { 0, SlfTst_Result, 0, Controller_Port }
1A33                6979 ;>      Status6: Error_Status { RdStat, RdErrCnt, WrStat, WrErrCnt }
1A33                6980 ;>      Status7: Last_Seek_Address { Lst_HiCyl, Lst_LoCyl, Lst_Head,
1A33                6981 ;>                                   Lst_Sector }
1A33                6982 ;>
1A33                6983 ;>      { all illegal status requests will return standard status }
1A33                6984 ;>
1A33                6985 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1A33                6986                 .LSTOFF
1A33                6989                 .LSTON


































        WIDGET.ASSEM            Page 217
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1A33                6990                 .Page
1A33                6991                 .FIN
1A33                6992 
1A33                6993 Read_CStatus:
1A33 E6 0A 03    10 6994                  Ld     Wrk_Io+$A,#Rd_Stat_Response
1A36 D6 03 02    20 6995                 Call    Ack_Read
1A39                6996                 
1A39 EC 10        6 6997                 Ld      !rE,#.HIBYTE. StatusArray
1A3B FC 15        6 6998                 Ld      !rF,#.LOWBYTE. StatusArray
1A3D                6999                 
1A3D D6 1A EF    20 7000                 Call    Ld_Param1
1A40                7001                 
1A40 56 E0 0F    10 7002                 And     !r0,#$0F ;mask off all but legal status request
1A43 A6 E0 07    10 7003                 Cp      !r0,#7 ;check for except case
1A46 AD 12 CA       7004                 Jp      Gt,Rd_Leave
1A49                7005                 
1A49 2C 1A        6 7006                 Ld      !r2,#.HIBYTE. Stat_Table
1A4B 3C 5C        6 7007                 Ld      !r3,#.LOWBYTE. Stat_Table
1A4D 90 E0        6 7008                 Rl      !r0
1A4F 02 30        6 7009                 Add     !r3,!r0
1A51 16 E2 00    10 7010                 Adc     !r2,#0
1A54 C2 C2       12 7011                 Ldc     !rC,@!!r2
1A56 A0 E2       10 7012                 Incw    !!r2
1A58 C2 D2       12 7013                 Ldc     !rD,@!!r2
1A5A 30 EC        8 7014                 Jp      @!rC
1A5C                7015                 
1A5C 12 CA          7016 Stat_Table:     .DW     Rd_Leave
1A5E 1A 6C          7017                 .DW     Ld_Stat1
1A60 1A 77          7018                 .DW     Ld_Stat2
1A62 1A 81          7019                 .DW     Ld_Stat3
1A64 1A 85          7020                 .DW     Ld_Stat4
1A66 1A 8F          7021                 .DW     Ld_Stat5
1A68 1A 9D          7022                 .DW     Ld_Stat6
1A6A 1A A7          7023                 .DW     Ld_Stat7
1A6C                7024                 
1A6C A0 EE       10 7025 Ld_Stat1:       Incw    !!rE
1A6E 2C 14        6 7026                 Ld      !r2,#.HIBYTE. LogicalBlock
1A70 3C A1        6 7027                 Ld      !r3,#.LOWBYTE. LogicalBlock
1A72 D6 1E BD    20 7028                 Call    Move4_B0
1A75 8B 40          7029                 Jr      Ld_Stat_End
1A77                7030                 
1A77 0C 52        6 7031 Ld_Stat2:       Ld      !r0,#Cylinder
1A79 1C 04        6 7032 Ld_Stat2_1:     Ld      !r1,#4 ;move 4 bytes
1A7B 93 0E       18 7033 Ld_Stat2_Lp:    Ldei    @!!rE,@!r0
1A7D 1A FC          7034                 Djnz    !r1,Ld_Stat2_Lp
1A7F 8B 36          7035                 Jr      Ld_Stat_End
1A81                7036                 
1A81 0C 50        6 7037 Ld_Stat3:       Ld      !r0,#Cur_Cyl
1A83 8B F4          7038                 Jr      Ld_Stat2_1
1A85                7039                 
1A85 08 24        6 7040 Ld_Stat4:       Ld      !r0,Excpt_Status
1A87 18 56        6 7041                 Ld      !r1,DiskStatus
1A89 28 5A        6 7042                 Ld      !r2,BlkStat
1A8B 38 58        6 7043                 Ld      !r3,Data_Type





        WIDGET.ASSEM            Page 218
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1A8D 8B 20          7044                 Jr      Ld_Stat_Reg
1A8F                7045                 
1A8F 0C 00        6 7046 Ld_Stat5:       Ld      !r0,#0
1A91 18 25        6 7047                 Ld      !r1,SlfTst_Result
1A93 28 02        6 7048                 Ld      !r2,Port2
1A95 CC 1F        6 7049                 Ld      !rC,#.HIBYTE. Status_Port
1A97 DC 00        6 7050                 Ld      !rD,#.LOWBYTE. Status_Port
1A99 82 3C       12 7051                 Lde     !r3,@!!rC
1A9B 8B 12          7052                 Jr      Ld_Stat_Reg
1A9D                7053                 
1A9D 08 26        6 7054 Ld_Stat6:       Ld      !r0,RdStat
1A9F 18 27        6 7055                 Ld      !r1,RdErrCnt
1AA1 28 28        6 7056                 Ld      !r2,WrStat
1AA3 38 29        6 7057                 Ld      !r3,WrErrCnt
1AA5 8B 08          7058                 Jr      Ld_Stat_Reg
1AA7                7059                 
1AA7 08 5C        6 7060 Ld_Stat7:       Ld      !r0,Lst_HiCyl
1AA9 18 5D        6 7061                 Ld      !r1,Lst_LoCyl
1AAB 28 5E        6 7062                 Ld      !r2,Lst_Head
1AAD 38 5F        6 7063                 Ld      !r3,Lst_Sector
1AAF                7064                 
1AAF 48 FD        6 7065 Ld_Stat_Reg:    Ld      !r4,Rp
1AB1 5C 04        6 7066                 Ld      !r5,#4 ;move 4 bytes
1AB3 93 4E       18 7067 Stat5_Lp:       Ldei    @!!rE,@!r4
1AB5 5A FC          7068                 Djnz    !r5,Stat5_Lp
1AB7                7069                 
1AB7 E6 0A 01    10 7070 Ld_Stat_End:     Ld     Wrk_Io+$A,#Init_Response
1ABA B0 0B        6 7071                  Clr    Wrk_Io+$B
1ABC 8D 12 D2       7072                 Jp      Rd_Leave1
1ABF                7073 
1ABF                7074                 .LSTOFF
1ABF                7076                 .LSTON



























        WIDGET.ASSEM            Page 219
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1ABF                7077                 .Page
1ABF                7078 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1ABF                7079 ;>
1ABF                7080 ;>      Procedure: Read_SStatus
1ABF                7081 ;>
1ABF                7082 ;>      This procedure is used by the host to examine the servo processor's
1ABF                7083 ;>      status information. The controller makes NO assumptions concerning
1ABF                7084 ;>      knowledge or meaning of the status bits, nor does the controller
1ABF                7085 ;>      interpret the status request sent by the host. In other words,
1ABF                7086 ;>      when the host issues a request for status to the servo, it is
1ABF                7087 ;>      his responsibility to make certain that the request is meaningful.
1ABF                7088 ;>
1ABF                7089 ;>      The returned status is preceded by Standard Status.
1ABF                7090 ;>
1ABF                7091 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1ABF                7092                 .LSTOFF
1ABF                7095                 .LSTON










































        WIDGET.ASSEM            Page 220
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1ABF                7096                 .Page
1ABF                7097                 .FIN
1ABF                7098 
1ABF                7099 Read_SStatus:
1ABF D6 1E 89    20 7100                 Call    ClrNormStat
1AC2                7101                 
1AC2 E6 0A 04    10 7102                  Ld     Wrk_Io+$A,#Rd_SStat_Response
1AC5 D6 03 02    20 7103                 Call    Ack_Read
1AC8                7104                 
1AC8 D6 1A EF    20 7105                 Call    Ld_Param1
1ACB                7106                 
1ACB D6 04 13    20 7107                 Call    Set_Dmt
1ACE 09 43        6 7108                  Ld     ScrReg3,!r0
1AD0 E6 40 00    10 7109                  Ld     ScrReg0,#ReadStatus
1AD3 E6 41 00    10 7110                  Ld     ScrReg1,#0
1AD6 E6 42 00    10 7111                  Ld     ScrReg2,#0
1AD9 2C 28        6 7112                  Ld     !r2,#.HIBYTE. ServoStatus
1ADB 3C 1E        6 7113                  Ld     !r3,#.LOWBYTE. ServoStatus
1ADD D6 04 AB    20 7114                 Call    Bank_Call
1AE0 D6 04 1F    20 7115                 Call    Clr_Dmt
1AE3                7116                 
1AE3 D6 12 E6    20 7117                 Call    Ld_Stand_Stat
1AE6                7118                 
1AE6 2C 14        6 7119                  Ld     !r2,#.HIBYTE. SStatus0
1AE8 3C B6        6 7120                  Ld     !r3,#.LOWBYTE. SStatus0
1AEA D6 1E BD    20 7121                 Call    Move4_B0
1AED                7122                 
1AED 8B C8          7123                 Jr      Ld_Stat_End
1AEF                7124                 
1AEF                7125                 
1AEF E4 FD 44    10 7126 Ld_Param1:      Ld      ScrReg4,Rp
1AF2 70 FD          7127                 Push    Rp
1AF4 31 40        6 7128                 Srp     #Wrk_Scr
1AF6                7129                 
1AF6 EC 14        6 7130                 Ld      !rE,#.HIBYTE. ( CStatus4 + 2 )
1AF8 FC A7        6 7131                 Ld      !rF,#.LOWBYTE. ( CStatus4 + 2 )
1AFA 5C 04        6 7132                 Ld      !r5,#4 ;load 4 bytes
1AFC 83 4E       18 7133 Rd_SStat_Lp:    Ldei    @!r4,@!!rE
1AFE 5A FC          7134                 Djnz    !r5,Rd_SStat_Lp
1B00                7135                 
1B00 50 FD       10 7136                 Pop     Rp ;get back to original context
1B02 AF          14 7137                 Ret
1B03                7138                 
1B03                7139                 .LSTOFF
1B03                7141                 .LSTON














        WIDGET.ASSEM            Page 221
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B03                7142                 .Page
1B03                7143 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B03                7144 ;>
1B03                7145 ;>      Procedure: Send_ServoCmnd
1B03                7146 ;>
1B03                7147 ;>      This procedure is used by the host to send the servo a command
1B03                7148 ;>      of any type EXCEPT a status request ( use Read_SStatus for that ).
1B03                7149 ;>      The controller will Abort the operation if this servo command
1B03                7150 ;>      is sent to it.
1B03                7151 ;>
1B03                7152 ;>      Also, as in Read_SStatus, the host is responsible for the the
1B03                7153 ;>      command string that it send to the servo - all the Widget
1B03                7154 ;>      controller will do is pass along the command string.
1B03                7155 ;>
1B03                7156 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B03                7157                 .LSTOFF
1B03                7160                 .LSTON










































        WIDGET.ASSEM            Page 222
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B03                7161                 .Page
1B03                7162                 .FIN
1B03                7163 
1B03                7164 Send_ServoCmnd:
1B03 D6 1E 89    20 7165                 Call    ClrNormStat
1B06                7166                 
1B06 E6 0A 05    10 7167                  Ld     Wrk_Io+$A,#Sd_S_C_Response
1B09 D6 03 02    20 7168                 Call    Ack_Read
1B0C                7169                 
1B0C D6 1A EF    20 7170                 Call    Ld_Param1 ;get servo command
1B0F 42 00        6 7171                 Or      !r0,!r0 ;check for Status Command
1B11 EB 03          7172                 Jr      Nz,S_Scmnd
1B13                7173                 
1B13 D6 05 1F    20 7174                 Call    Abort
1B16                7175                 
1B16 D6 04 13    20 7176 S_Scmnd:        Call    Set_Dmt
1B19 09 40        6 7177                  Ld     ScrReg0,!r0
1B1B 19 41        6 7178                  Ld     ScrReg1,!r1
1B1D 29 42        6 7179                  Ld     ScrReg2,!r2
1B1F 39 43        6 7180                  Ld     ScrReg3,!r3
1B21 2C 27        6 7181                  Ld     !r2,#.HIBYTE. ServoCmnd
1B23 3C F8        6 7182                  Ld     !r3,#.LOWBYTE. ServoCmnd
1B25 D6 04 AB    20 7183                 Call    Bank_Call
1B28 D6 04 1F    20 7184                 Call    Clr_Dmt
1B2B                7185                 
1B2B 8D 12 CA       7186                 Jp      Rd_Leave
1B2E                7187                 
1B2E                7188                 .LSTOFF
1B2E                7190                 .LSTON






























        WIDGET.ASSEM            Page 223
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B2E                7191                 .Page
1B2E                7192 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B2E                7193 ;>
1B2E                7194 ;>      Procedure: Send_Seek
1B2E                7195 ;>
1B2E                7196 ;>      This procedure allows the host to position the heads ANYWHERE
1B2E                7197 ;>      on the disk service that it pleases - the only consideration
1B2E                7198 ;>      is to be aware of the crash stop positions!
1B2E                7199 ;>
1B2E                7200 ;>      The form of the parameters passed into the controller are
1B2E                7201 ;>      HiCylinder, LowCylinder, Head, Sector. Keep in mind that these
1B2E                7202 ;>      values will be used to check for a valid header if and when
1B2E                7203 ;>      a state machine operation ios initiated.
1B2E                7204 ;>
1B2E                7205 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B2E                7206                 .LSTOFF
1B2E                7209                 .LSTON










































        WIDGET.ASSEM            Page 224
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B2E                7210                 .Page
1B2E                7211                 .FIN
1B2E                7212 
1B2E                7213 Send_Seek:
1B2E D6 1E 89    20 7214                 Call    ClrNormStat
1B31                7215                 
1B31 E6 0A 06    10 7216                  Ld     Wrk_Io+$A,#S_Seek_Response
1B34 D6 03 02    20 7217                 Call    Ack_Read
1B37                7218                 
1B37 D6 1A EF    20 7219                 Call    Ld_Param1 ;get parameters from command processor
1B3A                7220                 
1B3A E6 57 80    10 7221                 Ld      Seek_Type,#Access
1B3D                7222                 
1B3D C8 E0        6 7223                  Ld     !rC,!r0 ;pass params to Seek
1B3F D8 E1        6 7224                  Ld     !rD,!r1
1B41 E8 E2        6 7225                  Ld     !rE,!r2
1B43 F8 E3        6 7226                  Ld     !rF,!r3
1B45 D6 05 D7    20 7227                 Call    New_Seek
1B48 2C 29        6 7228                  Ld     !r2,#.HIBYTE. Set_SeekNeeded
1B4A 3C FD        6 7229                  Ld     !r3,#.LOWBYTE. Set_SeekNeeded
1B4C D6 04 AB    20 7230                 Call    Bank_Call
1B4F                7231                 
1B4F 8D 12 CA       7232                 Jp      Rd_Leave
1B52                7233                 
1B52                7234                 .LSTOFF
1B52                7236                 .LSTON

































        WIDGET.ASSEM            Page 225
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B52                7237                 .Page
1B52                7238 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B52                7239 ;>
1B52                7240 ;>      Procedure: Send_Restore
1B52                7241 ;>
1B52                7242 ;>      This command allows the host to issue either a Format Recal or
1B52                7243 ;>      a Data Recal to the servo without having to build a primitive
1B52                7244 ;>      servo command. The value of which type of restore is to be
1B52                7245 ;>      performed is passed in with the command string.
1B52                7246 ;>
1B52                7247 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B52                7248                 .LSTOFF
1B52                7251                 .LSTON














































        WIDGET.ASSEM            Page 226
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B52                7252                 .Page
1B52                7253                 .FIN
1B52                7254 
1B52                7255 Send_Restore:
1B52 D6 1E 89    20 7256                 Call    ClrNormStat
1B55                7257                 
1B55 E6 0A 07    10 7258                  Ld     Wrk_Io+$A,#S_Rstr_Response
1B58 D6 03 02    20 7259                 Call    Ack_Read
1B5B                7260                 
1B5B D6 1A EF    20 7261                 Call    Ld_Param1 ;get recal type
1B5E A6 E0 40    10 7262                 Cp      !r0,#DataRecal
1B61 6B 08          7263                 Jr      Z,S_Restore
1B63 A6 E0 70    10 7264                 Cp      !r0,#FrmtRecal
1B66 6B 03          7265                 Jr      Z,S_Restore
1B68                7266                 
1B68 D6 05 1F    20 7267                 Call    Abort
1B6B                7268                 
1B6B 2C 28        6 7269 S_Restore:       Ld     !r2,#.HIBYTE. Restore
1B6D 3C A0        6 7270                  Ld     !r3,#.LOWBYTE. Restore
1B6F D6 04 AB    20 7271                 Call    Bank_Call
1B72                7272                 
1B72 8D 12 CA       7273                 Jp      Rd_Leave
1B75                7274                 
1B75                7275                 .LSTOFF
1B75                7277                 .LSTON


































        WIDGET.ASSEM            Page 227
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B75                7278                 .Page
1B75                7279 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B75                7280 ;>
1B75                7281 ;>      Procedure: Set_Recovery
1B75                7282 ;>
1B75                7283 ;>      This procedure is used by the host to set the global
1B75                7284 ;>      variable Recovery either on or off. This variable controls
1B75                7285 ;>      the behavior of Widget when an exception occurs; in the
1B75                7286 ;>      case of Recovery = True, the controller tries everything it
1B75                7287 ;>      can to correct the exception and continue about it's day. 
1B75                7288 ;>      When Recovery = False, however, the controller will do nothing
1B75                7289 ;>      about the problem and report the error to the host.
1B75                7290 ;>
1B75                7291 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B75                7292                 .LSTOFF
1B75                7295                 .LSTON











































        WIDGET.ASSEM            Page 228
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B75                7296                 .Page
1B75                7297                 .FIN
1B75                7298 
1B75                7299 Set_Recovery:
1B75 D6 1E 89    20 7300                 Call    ClrNormStat
1B78                7301                 
1B78 E6 0A 08    10 7302                  Ld     Wrk_Io+$A,#Set_Rcvr_Response
1B7B D6 03 02    20 7303                 Call    Ack_Read
1B7E                7304                 
1B7E D6 1A EF    20 7305                 Call    Ld_Param1 ;get Set/Reset param
1B81                7306                 
1B81 46 24 80    10 7307                 Or      Excpt_Status,#Recovery ;assume True
1B84 42 00        6 7308                 Or      !r0,!r0 ;test for true or false
1B86 EB 03          7309                 Jr      Nz,Set_Rcvr_Store
1B88                7310                 
1B88 56 24 7F    10 7311                 And     Excpt_Status,#$FF-Recovery ;clear old bit
1B8B                7312                 
1B8B 8D 12 CA       7313 Set_Rcvr_Store: Jp      Rd_Leave
1B8E                7314 
1B8E                7315                 .LSTOFF
1B8E                7317                 .LSTON






































        WIDGET.ASSEM            Page 229
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B8E                7318                 .Page
1B8E                7319 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B8E                7320 ;>
1B8E                7321 ;>      Procedure: Send_Park
1B8E                7322 ;>
1B8E                7323 ;>      This diagnostic command allows the host to issue a Park
1B8E                7324 ;>      command to the drive. This command has the effect of
1B8E                7325 ;>      sending the drive heads off the data surface.
1B8E                7326 ;>
1B8E                7327 ;>      Inputs: { none }
1B8E                7328 ;>
1B8E                7329 ;>      Outputs: { none }
1B8E                7330 ;>
1B8E                7331 ;>      Algorithm:
1B8E                7332 ;>
1B8E                7333 ;>      BEGIN
1B8E                7334 ;>       ClrNormStat
1B8E                7335 ;>       Ack_Read( S_Park_Response )
1B8E                7336 ;>       Park_Heads
1B8E                7337 ;>       Rd_Leave
1B8E                7338 ;>
1B8E                7339 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1B8E                7340                 .LSTOFF
1B8E                7343                 .LSTON



































        WIDGET.ASSEM            Page 230
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1B8E                7344                 .Page
1B8E                7345                 .FIN
1B8E                7346 
1B8E                7347 Send_Park:
1B8E D6 1E 89    20 7348                 Call    ClrNormStat
1B91                7349                 
1B91 E6 0A 0A    10 7350                  Ld     Wrk_Io+$A,#S_Park_Response
1B94 D6 03 02    20 7351                 Call    Ack_Read
1B97                7352                 
1B97 2C 29        6 7353                  Ld     !r2,#.HIBYTE. Park_Heads
1B99 3C 43        6 7354                  Ld     !r3,#.LOWBYTE. Park_Heads
1B9B D6 04 AB    20 7355                 Call    Bank_Call
1B9E                7356                 
1B9E 8D 12 CA       7357                 Jp      Rd_Leave
1BA1                7358                 
1BA1                7359                 .LSTOFF
1BA1                7361                 .LSTON










































        WIDGET.ASSEM            Page 231
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1BA1                7362                 .Page
1BA1                7363 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1BA1                7364 ;>
1BA1                7365 ;>      Procedure: Store_Map
1BA1                7366 ;>
1BA1                7367 ;>      This command allows the Host to logically remap { i.e., change
1BA1                7368 ;>      the interleave factor through a remapping of the sector addresses. }
1BA1                7369 ;>      The way in which the Map is downloaded into the SpareTable is
1BA1                7370 ;>      by doing a write sequence from the Host to the controller.
1BA1                7371 ;>
1BA1                7372 ;>      Inputs: { none }
1BA1                7373 ;>
1BA1                7374 ;>      Outputs: { none }
1BA1                7375 ;>
1BA1                7376 ;>      Algorithm:
1BA1                7377 ;>
1BA1                7378 ;>      BEGIN
1BA1                7379 ;>       Get_Write_Data( St_Map_Response )
1BA1                7380 ;>       FOR i := 0 TO NbrSctrs-1 DO
1BA1                7381 ;>              IF ( WriteBuffer[ i ] >= NbrSctrs ) THEN Abort
1BA1                7382 ;>              Map_Table[ i ] := WriteBuffer[ i ]
1BA1                7383 ;>       UpDate_Spare_Table
1BA1                7384 ;>      END
1BA1                7385 ;>
1BA1                7386 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1BA1                7387                 .LSTOFF
1BA1                7390                 .LSTON
































        WIDGET.ASSEM            Page 232
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1BA1                7391                 .Page
1BA1                7392                 .FIN
1BA1                7393 
1BA1                7394 Store_Map:
1BA1 D6 1E 89    20 7395                 Call    ClrNormStat
1BA4                7396                 
1BA4 E6 0A 0E    10 7397                  Ld     Wrk_Io+$A,#St_Map_Response
1BA7 D6 02 ED    20 7398                 Call    Get_Wr_Data
1BAA                7399                 
1BAA 2C 10        6 7400                 Ld      !r2,#.HIBYTE. WBuffer1
1BAC 3C 21        6 7401                 Ld      !r3,#.LOWBYTE. WBuffer1
1BAE EC 16        6 7402                 Ld      !rE,#.HIBYTE. Map_Table
1BB0 FC 81        6 7403                 Ld      !rF,#.LOWBYTE. Map_Table
1BB2 1C 13        6 7404                 Ld      !r1,#NbrSctrs
1BB4                7405                 
1BB4 82 02       12 7406 St_Map_Lp:      Lde     !r0,@!!r2 ;get a value from Write Buffer
1BB6 A6 E0 13    10 7407                 Cp      !r0,#NbrSctrs
1BB9 1B 05          7408                 Jr      Lt,St_Map1
1BBB                7409                 
1BBB A8 E0        6 7410                  Ld     !rA,!r0
1BBD D6 05 1F    20 7411                 Call    Abort
1BC0                7412                 
1BC0 92 0E       12 7413 St_Map1:        Lde     @!!rE,!r0 ;store value into Map_Table
1BC2 A0 E2       10 7414                 Incw    !!r2
1BC4 A0 EE       10 7415                 Incw    !!rE
1BC6 1A EC          7416                 Djnz    !r1,St_Map_Lp
1BC8                7417                 
1BC8 2C 24        6 7418                  Ld     !r2,#.HIBYTE. UpDate_SprTbl
1BCA 3C 51        6 7419                  Ld     !r3,#.LOWBYTE. UpDate_SprTbl
1BCC D6 04 AB    20 7420                 Call    Bank_Call
1BCF                7421                 
1BCF 8D 12 CA       7422                 Jp      Rd_Leave
1BD2                7423                 
1BD2                7424                 .LSTOFF
1BD2                7426                 .LSTON
























        WIDGET.ASSEM            Page 233
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1BD2                7427                 .Page
1BD2                7428 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1BD2                7429 ;>
1BD2                7430 ;>      Procedure: Wr_SprTbl
1BD2                7431 ;>
1BD2                7432 ;>      This command allows the host to update the spare table
1BD2                7433 ;>      without the controller's intervention. BE CAREFUL WITH
1BD2                7434 ;>      THIS ONE!
1BD2                7435 ;>
1BD2                7436 ;>      Inputs: { none }
1BD2                7437 ;>
1BD2                7438 ;>      Outputs: { none }
1BD2                7439 ;>
1BD2                7440 ;>      Algorithm:
1BD2                7441 ;>
1BD2                7442 ;>      BEGIN
1BD2                7443 ;>       IF NOT( Chk_PassWord( CommandString+1 ) ) THEN Abort
1BD2                7444 ;>       Ack_Read( Wr_Spr_Response )
1BD2                7445 ;>       Clr_Bsy( SpareArray )
1BD2                7446 ;>
1BD2                7447 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1BD2                7448                 .LSTOFF
1BD2                7451                 .LSTON




































        WIDGET.ASSEM            Page 234
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1BD2                7452                 .Page
1BD2                7453                 .FIN
1BD2                7454 
1BD2                7455 Wr_SprTbl:
1BD2 E6 0A 10    10 7456                  Ld     Wrk_Io+$A,#Wr_Spr_Response
1BD5 D6 02 ED    20 7457                 Call    Get_Wr_Data
1BD8                7458                 
1BD8 D6 1E 89    20 7459                  Call    ClrNormStat
1BDB                7460                 
1BDB E6 42 14    10 7461                  Ld     ScrReg2,#.HIBYTE. ( CStatus4 + 2 )
1BDE E6 43 A7    10 7462                  Ld     ScrReg3,#.LOWBYTE. ( CStatus4 + 2 )
1BE1 2C 24        6 7463                  Ld     !r2,#.HIBYTE. Chk_PassWord
1BE3 3C E6        6 7464                  Ld     !r3,#.LOWBYTE. Chk_PassWord
1BE5 D6 04 AB    20 7465                 Call    Bank_Call
1BE8 EB 03          7466                 Jr      Nz,Wr_Spr1
1BEA                7467                 
1BEA D6 05 1F    20 7468                 Call    Abort
1BED                7469                 
1BED 2C 20        6 7470 Wr_Spr1:         Ld     !r2,#.HIBYTE. WrBuf_To_Spr
1BEF 3C 89        6 7471                  Ld     !r3,#.LOWBYTE. WrBuf_To_Spr
1BF1 D6 04 AB    20 7472                 Call    Bank_Call
1BF4 2C 24        6 7473                  Ld     !r2,#.HIBYTE. UpDate_SprTbl
1BF6 3C 51        6 7474                  Ld     !r3,#.LOWBYTE. UpDate_SprTbl
1BF8 D6 04 AB    20 7475                 Call    Bank_Call
1BFB                7476                 
1BFB 8D 12 CA       7477                 Jp      Rd_Leave
1BFE                7478                 
1BFE                7479                 .LSTOFF
1BFE                7481                 .LSTON






























        WIDGET.ASSEM            Page 235
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1BFE                7482                 .Page
1BFE                7483 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1BFE                7484 ;>
1BFE                7485 ;>      Procedure: Format
1BFE                7486 ;>
1BFE                7487 ;>      This procedure allows the host to format the track
1BFE                7488 ;>      that the heads are currently positioned over.
1BFE                7489 ;>
1BFE                7490 ;>      BE ULTRA CAREFUL HERE!!!! THIS COMMAND DESTROYS ALL
1BFE                7491 ;>      DATA ON THE TRACK.... DATA RECOVERY WILL BE IMPOSSIBLE
1BFE                7492 ;>      AFTER A TRACK HAS BEEN FORMATTED.
1BFE                7493 ;>
1BFE                7494 ;>      The two parameters that are passed into the controller
1BFE                7495 ;>      by the host allow the host to specify the offset from
1BFE                7496 ;>      Index mark ( in sectors ) that Sector 0 will be located
1BFE                7497 ;>      and the interleave factor.
1BFE                7498 ;>
1BFE                7499 ;>      Inputs: { none }
1BFE                7500 ;>
1BFE                7501 ;>      Outputs: { none }
1BFE                7502 ;>
1BFE                7503 ;>      Algorithm:
1BFE                7504 ;>
1BFE                7505 ;>      BEGIN
1BFE                7506 ;>       ClrNormStat
1BFE                7507 ;>       IF NOT( Chk_PassWord( CStatus4+3 ) ) THEN Abort
1BFE                7508 ;>       Ack_Read( Fmt_Response )
1BFE                7509 ;>       IF NOT( FormatTrack( CStatus4+1, CStatus4+2 ) )
1BFE                7510 ;>        THEN Abort
1BFE                7511 ;>       Rd_Leave
1BFE                7512 ;>      END
1BFE                7513 ;>
1BFE                7514 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1BFE                7515                 .LSTOFF
1BFE                7518                 .LSTON
























        WIDGET.ASSEM            Page 236
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1BFE                7519                 .Page
1BFE                7520                 .FIN
1BFE                7521 
1BFE                7522 Format:
1BFE E6 0A 11    10 7523                  Ld     Wrk_Io+$A,#Fmt_Response
1C01 D6 03 02    20 7524                 Call    Ack_Read
1C04                7525                  
1C04 D6 1C 15    20 7526                 Call    Chk_FmtParms
1C07                7527                  
1C07 48 E0        6 7528                  Ld     !r4,!r0
1C09 58 E1        6 7529                  Ld     !r5,!r1
1C0B 2C 10        6 7530                  Ld     !r2,#.HIBYTE. FormatTrack
1C0D 3C CC        6 7531                  Ld     !r3,#.LOWBYTE. FormatTrack
1C0F D6 04 AB    20 7532                 Call    Bank_Call
1C12                7533                 
1C12 8D 12 CA       7534                 Jp      Rd_Leave
1C15                7535                 
1C15                7536                 
1C15 D6 1E 89    20 7537 Chk_FmtParms:   Call    ClrNormStat
1C18                7538                 
1C18 E6 42 14    10 7539                  Ld     ScrReg2,#.HIBYTE. ( CStatus4+4 )
1C1B E6 43 A9    10 7540                  Ld     ScrReg3,#.LOWBYTE. ( CStatus4+4 )
1C1E 2C 24        6 7541                  Ld     !r2,#.HIBYTE. Chk_PassWord
1C20 3C E6        6 7542                  Ld     !r3,#.LOWBYTE. Chk_PassWord
1C22 D6 04 AB    20 7543                 Call    Bank_Call
1C25 EB 03          7544                 Jr      Nz,Format1
1C27                7545                 
1C27 D6 05 1F    20 7546                 Call    Abort
1C2A                7547 
1C2A D6 1A EF    20 7548 Format1:        Call    Ld_Param1
1C2D                7549 
1C2D 76 E0 F0    10 7550                 Tm      !r0,#$F0 ;check for illegal offset
1C30 6B 07          7551                 Jr      Z,Fmt_Chk_Inter
1C32                7552                 
1C32 98 E0        6 7553 Format_Abort:    Ld     !r9,!r0
1C34 A8 E1        6 7554                  Ld     !rA,!r1
1C36 D6 05 1F    20 7555                 Call    Abort
1C39                7556                 
1C39 A6 E1 06    10 7557 Fmt_Chk_Inter:  Cp      !r1,#Max_InterLeave
1C3C BB F4          7558                 Jr      Ugt,Format_Abort
1C3E AF          14 7559                 Ret
1C3F                7560                 
1C3F                7561                 .LSTOFF
1C3F                7563                 .LSTON















        WIDGET.ASSEM            Page 237
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C3F                7564                 .Page
1C3F                7565 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C3F                7566 ;>
1C3F                7567 ;>      Procedure: Read_Abort
1C3F                7568 ;>
1C3F                7569 ;>      This command is used by the host to read the contents of
1C3F                7570 ;>      the controller's register set at the time of the last abort.
1C3F                7571 ;>      If there has been no abort, the results of this command
1C3F                7572 ;>      will be undefined.
1C3F                7573 ;>
1C3F                7574 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C3F                7575                 .LSTOFF
1C3F                7578                 .LSTON














































        WIDGET.ASSEM            Page 238
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C3F                7579                 .Page
1C3F                7580                 .FIN
1C3F                7581 
1C3F                7582 Read_Abort:
1C3F D6 1E 89    20 7583                 Call    ClrNormStat
1C42                7584                 
1C42 E6 0A 13    10 7585                  Ld     Wrk_Io+$A,#Rd_Abrt_Response
1C45 D6 03 02    20 7586                 Call    Ack_Read
1C48                7587                 
1C48 0C 16        6 7588                  Ld     !r0,#.HIBYTE. Abort_Stat
1C4A 1C D8        6 7589                  Ld     !r1,#.LOWBYTE. Abort_Stat
1C4C 2C 10        6 7590                  Ld     !r2,#.HIBYTE. RBuffer1
1C4E 3C 19        6 7591                  Ld     !r3,#.LOWBYTE. RBuffer1
1C50 4C 80        6 7592                  Ld     !r4,#128 ;move 128 bytes
1C52                7593                  
1C52 82 50       12 7594 Rd_Abt_Lp:      Lde     !r5,@!!r0
1C54 92 52       12 7595                 Lde     @!!r2,!r5
1C56 A0 E0       10 7596                 Incw    !!r0
1C58 A0 E2       10 7597                 Incw    !!r2
1C5A 4A F6          7598                 Djnz    !r4,Rd_Abt_Lp
1C5C                7599                 
1C5C 8D 12 CA       7600                 Jp      Rd_Leave
1C5F                7601                 
1C5F                7602                 .LSTOFF
1C5F                7604                 .LSTON


































        WIDGET.ASSEM            Page 239
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C5F                7605                 .Page
1C5F                7606 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C5F                7607 ;>
1C5F                7608 ;>      Procedure: D_RstSrvo
1C5F                7609 ;>
1C5F                7610 ;>      This procedure allows the host to reset the servo processor.
1C5F                7611 ;>
1C5F                7612 ;>      Inputs: { none }
1C5F                7613 ;>
1C5F                7614 ;>      Outputs: { none }
1C5F                7615 ;>
1C5F                7616 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C5F                7617                 .LSTOFF
1C5F                7620                 .LSTON













































        WIDGET.ASSEM            Page 240
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C5F                7621                 .Page
1C5F                7622                 .FIN
1C5F                7623 
1C5F                7624 D_RstSrvo:
1C5F D6 1E 89    20 7625                 Call    ClrNormStat
1C62                7626                  
1C62 E6 0A 14    10 7627                  Ld     Wrk_Io+$A,#RstSrvo_Response
1C65 D6 03 02    20 7628                 Call    Ack_Read
1C68                7629                 
1C68 2C 29        6 7630                  Ld     !r2,#.HIBYTE. ResetServo
1C6A 3C 5D        6 7631                  Ld     !r3,#.LOWBYTE. ResetServo
1C6C D6 04 AB    20 7632                 Call    Bank_Call
1C6F                7633                 
1C6F 8D 12 CA       7634                 Jp      Rd_Leave
1C72                7635                 
1C72                7636                 .LSTOFF
1C72                7638                 .LSTON










































        WIDGET.ASSEM            Page 241
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C72                7639                 .Page
1C72                7640 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C72                7641 ;>
1C72                7642 ;>      Procedure: D_Init_SprTbl
1C72                7643 ;>
1C72                7644 ;>      This procedure allows the host to initialize the spare table
1C72                7645 ;>      on the disk.
1C72                7646 ;>
1C72                7647 ;>      Inputs: { none }
1C72                7648 ;>
1C72                7649 ;>      Outputs: { none }
1C72                7650 ;>
1C72                7651 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C72                7652                 .LSTOFF
1C72                7655                 .LSTON












































        WIDGET.ASSEM            Page 242
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C72                7656                 .Page
1C72                7657                 .FIN
1C72                7658 
1C72                7659 D_Init_SprTbl:
1C72 D6 1E 89    20 7660                 Call    ClrNormStat
1C75                7661                 
1C75 E6 0A 12    10 7662                  Ld     Wrk_Io+$A,#I_Spr_Response
1C78 D6 03 02    20 7663                 Call    Ack_Read
1C7B                7664                 
1C7B E6 42 14    10 7665                  Ld     ScrReg2,#.HIBYTE. ( CStatus4+4 )
1C7E E6 43 A9    10 7666                  Ld     ScrReg3,#.LOWBYTE. ( CStatus4+4 )
1C81 2C 24        6 7667                  Ld     !r2,#.HIBYTE. Chk_PassWord
1C83 3C E6        6 7668                  Ld     !r3,#.LOWBYTE. Chk_PassWord
1C85 D6 04 AB    20 7669                 Call    Bank_Call
1C88 EB 03          7670                 Jr      Nz,D_I_SprTbl
1C8A                7671                 
1C8A D6 05 1F    20 7672                 Call    Abort
1C8D                7673                 
1C8D D6 1A EF    20 7674 D_I_SprTbl:     Call    Ld_Param1
1C90                7675                 
1C90 48 E0        6 7676                  Ld     !r4,!r0 ;pass offset value
1C92 58 E1        6 7677                  Ld     !r5,!r1 ;pass interleave value
1C94 2C 22        6 7678                  Ld     !r2,#.HIBYTE. Init_SprTbl
1C96 3C A5        6 7679                  Ld     !r3,#.LOWBYTE. Init_SprTbl
1C98 D6 04 AB    20 7680                 Call    Bank_Call
1C9B                7681                 
1C9B 8D 12 CA       7682                 Jp      Rd_Leave
1C9E                7683                 
1C9E                7684                 .LSTOFF
1C9E                7689                 .LSTON





























        WIDGET.ASSEM            Page 243
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C9E                7690                 .Page
1C9E                7691 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C9E                7692 ;>
1C9E                7693 ;>      Module: Cmnd2  { continuation of Cmnd.Assem }
1C9E                7694 ;>
1C9E                7695 ;>      This module contains all the code associated with processing
1C9E                7696 ;>      the System commands.
1C9E                7697 ;>
1C9E                7698 ;>      PROCEDURE Sys_Read
1C9E                7699 ;>      PROCEDURE Sys_Write
1C9E                7700 ;>
1C9E                7701 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C9E                7702                 .LSTOFF
1C9E                7705                 .LSTON













































        WIDGET.ASSEM            Page 244
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C9E                7706                 .Page
1C9E                7707 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C9E                7708 ;>
1C9E                7709 ;>      Procedure: Sys_Read
1C9E                7710 ;>
1C9E                7711 ;>      This procedure is the System Read command for Widget. It
1C9E                7712 ;>      allows the host to read up to 8 sequential blocks without
1C9E                7713 ;>      sending any additional commands. Between each block status
1C9E                7714 ;>      is passed back to the host with the data, and the host must
1C9E                7715 ;>      set CMD before the next block can be read. In general, the protocol
1C9E                7716 ;>      is about the same as in Pro_Read.
1C9E                7717 ;>
1C9E                7718 ;>      Inputs: { none }
1C9E                7719 ;>
1C9E                7720 ;>      Outputs: { none }
1C9E                7721 ;>
1C9E                7722 ;>      Algorithm:
1C9E                7723 ;>
1C9E                7724 ;>      BEGIN
1C9E                7725 ;>       Ld_LgclBlk( Wid_Log_Offset )
1C9E                7726 ;>       Count := Ld_Param1.FirstParam
1C9E                7727 ;>       Offset := 0
1C9E                7728 ;>       BlockNumber := Load_Logical
1C9E                7729 ;>       ClrNormStat
1C9E                7730 ;>       Get_Type_Check( BlockNumber + Count )
1C9E                7731 ;>       Seek_Type := Access
1C9E                7732 ;>       DiskStat.Wr_Op := False
1C9E                7733 ;>       OverLap
1C9E                7734 ;>       IF NOT( ReadBlock )
1C9E                7735 ;>        THEN 
1C9E                7736 ;>              SS_RdErr
1C9E                7737 ;>              Goto Pro_Rd_Exit
1C9E                7738 ;>       WHILE Always DO
1C9E                7739 ;>              BlockNumber := BlockNumber + 1
1C9E                7740 ;>              IF NOT( Srch_Cache )
1C9E                7741 ;>               THEN OverLap
1C9E                7742 ;>              IF NOT( Read_Fast )
1C9E                7743 ;>               THEN Goto Pro_Rd_Exit
1C9E                7744 ;>               ELSE
1C9E                7745 ;>                IF BlkStat.Bad_Block
1C9E                7746 ;>                 THEN GoTo Pro_Rd_BB
1C9E                7747 ;>              IF ( Count > 1 )
1C9E                7748 ;>               THEN 
1C9E                7749 ;>                    Command_Pending,IBsy := True, Response := Sys_Rd_Resp
1C9E                7750 ;>                    Rd_Leave2
1C9E                7751 ;>               ELSE Rd_Leave
1C9E                7752 ;>              Count := Count - 1
1C9E                7753 ;>      END
1C9E                7754 ;>
1C9E                7755 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1C9E                7756                 .LSTOFF
1C9E                7759                 .LSTON







        WIDGET.ASSEM            Page 245
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1C9E                7760                 .Page
1C9E                7761                 .FIN
1C9E                7762 
1C9E                7763 Sys_Read:
1C9E E6 0A 22    10 7764                  Ld     Wrk_Io+$A,#Sys_Rd_Resp
1CA1 D6 1D 0D    20 7765                 Call    Sys_SetUp
1CA4                7766                 
1CA4                7767                 
1CA4 E6 57 80    10 7768 Sys_Rd_Seek:     Ld     Seek_Type,#Access
1CA7 56 56 DF    10 7769                  And    DiskStat,#$FF-Wr_Op
1CAA D6 1D 47    20 7770                 Call    Sys_Rw_Seek
1CAD D6 1E CC    20 7771                 Call    ReadBlock
1CB0 EB 11          7772                 Jr      Nz,Sys_Rd_Next
1CB2 8B 24          7773                 Jr      Sys_RdErr
1CB4                7774                 
1CB4 D6 1D 56    20 7775 Sys_Rd_Lp:      Call    Sys_Inc_Blk
1CB7 EB EB          7776                 Jr      Nz,Sys_Rd_Seek
1CB9                7777                 
1CB9 56 E0 3F    10 7778                 And     !r0,#$3F ;mask off head value
1CBC 09 55        6 7779                 Ld      Sector,!r0
1CBE                7780 
1CBE D6 1E EC    20 7781 Sys_Rd_OvrLp:   Call    Read_Fast
1CC1 6B 15          7782                 Jr      Z,Sys_Rd_Err
1CC3                7783 
1CC3 76 5A 02    10 7784 Sys_Rd_Next:    Tm      BlkStat,#B_Block ;check if bad block came back!
1CC6 EB 29          7785                 Jr      Nz,Sys_Rd_BB
1CC8                7786                 
1CC8 E6 0A 22    10 7787 Sys_Rd_N1:      Ld      Wrk_Io+$A,#Sys_Rd_Resp
1CCB E6 0B C0    10 7788                 Ld      Wrk_Io+$B,#Cmnd_Pending+IBsy
1CCE 4A 03          7789                 Djnz    !r4,Sys_Rd_More
1CD0                7790                 
1CD0 8D 12 CA       7791                 Jp      Rd_Leave
1CD3                7792                 
1CD3 D6 12 D2    20 7793 Sys_Rd_More:    Call    Rd_Leave1
1CD6 8B DC          7794                 Jr      Sys_Rd_Lp
1CD8                7795                 























        WIDGET.ASSEM            Page 246
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1CD8                7796                 .Page
1CD8                7797                 
1CD8 70 E4          7798 Sys_RdErr:      Push    !r4     ;save block count
1CDA D6 12 F2    20 7799                 Call    Read_Common ;retry for exception handling
1CDD 50 E4       10 7800 Sys_RErr1:      Pop     !r4     ;get block count
1CDF 70 FC          7801                 Push    Flags   ;save result
1CE1 70 E0          7802                 Push    !r0     ;save return code
1CE3 D6 06 0D    20 7803                 Call    Load_Logical ;restore block number sequence
1CE6 50 E0       10 7804                 Pop     !r0
1CE8 50 FC       10 7805                 Pop     Flags
1CEA EB D7          7806                 Jr      Nz,Sys_Rd_Next
1CEC                7807                 
1CEC D6 16 BD    20 7808                 Call    Data_Ex_Handler
1CEF 8B 07          7809                 Jr      Sys_Chk_Ftl
1CF1                7810 
1CF1 70 E4          7811 Sys_Rd_BB:      Push    !r4             ;save block count
1CF3 D6 12 DB    20 7812                 Call    Pro_Rd_BB
1CF6 8B E5          7813                 Jr      Sys_RErr1
1CF8                7814 
1CF8 D6 1D 03    20 7815 Sys_Chk_Ftl:    Call    Chk_FatalStat
1CFB ED 12 CA       7816                 Jp      Nz,Rd_Leave     ;get out if fatal error
1CFE                7817                 
1CFE D6 1E 89    20 7818                 Call    ClrNormStat
1D01 8B C5          7819                 Jr      Sys_Rd_N1
1D03                7820 
1D03 2C 14        6 7821 Chk_FatalStat:  Ld      !r2,#.HIBYTE. CStatus0
1D05 3C 95        6 7822                 Ld      !r3,#.LOWBYTE. CStatus0
1D07 82 02       12 7823                 Lde     !r0,@!!r2               ;get 1st byte of standard stat
1D09 76 E0 01    10 7824                 Tm      !r0,#Op_Failed          ;check if operation failed
1D0C AF          14 7825                 Ret
1D0D                7826 
1D0D                7827 
1D0D D6 03 02    20 7828 Sys_SetUp:      Call    Ack_Read
1D10                7829                  
1D10 D6 1E 89    20 7830                 Call    ClrNormStat
1D13                7831                 
1D13 0C 03        6 7832                  Ld     !r0,#Sys_Log_Offset
1D15 D6 06 4E    20 7833                 Call    Ld_LgclBlk
1D18                7834                 
1D18 D6 1A EF    20 7835                 Call    Ld_Param1
1D1B 42 00        6 7836                 Or      !r0,!r0 ;check for zero count
1D1D EB 03          7837                 Jr      Nz,Sys_Set1
1D1F                7838                 
1D1F D6 05 1F    20 7839                 Call    Abort
1D22                7840                 
1D22 48 E0        6 7841 Sys_Set1:       Ld      !r4,!r0 ;Count := ...
1D24                7842 
1D24 D6 06 0D    20 7843                 Call    Load_Logical
1D27 08 E4        6 7844                 Ld      !r0,!r4
1D29 00 E0        6 7845                 Dec     !r0 ;account for numbering 1..n
1D2B 02 E0        6 7846                 Add     !rE,!r0
1D2D 16 ED 00    10 7847                 Adc     !rD,#0
1D30 16 EC 00    10 7848                 Adc     !rC,#0
1D33 2C 21        6 7849                  Ld     !r2,#.HIBYTE. Get_Type_Check





        WIDGET.ASSEM            Page 247
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1D35 3C D8        6 7850                  Ld     !r3,#.LOWBYTE. Get_Type_Check
1D37 D6 04 AB    20 7851                 Call    Bank_Call
1D3A                7852                 
1D3A D6 06 0D    20 7853                 Call    Load_Logical
1D3D                7854                 
1D3D E6 58 02    10 7855                 Ld      Data_Type,#User_Type
1D40                7856                 
1D40 E6 0C 10    10 7857                 Ld      Wrk_Io+$C,#.HIBYTE. WBuffer1 ;get ready for more writes
1D43 E6 0D 21    10 7858                 Ld      Wrk_Io+$D,#.LOWBYTE. WBuffer1
1D46                7859                 
1D46 AF          14 7860                 Ret
1D47                7861                 
1D47 70 E4          7862 Sys_Rw_Seek:     Push   !r4 ;save state
1D49 2C 26        6 7863                  Ld     !r2,#.HIBYTE. OverLap
1D4B 3C 06        6 7864                  Ld     !r3,#.LOWBYTE. OverLap
1D4D D6 04 AB    20 7865                 Call    Bank_Call
1D50 50 E4       10 7866                  Pop    !r4
1D52 D6 06 0D    20 7867                 Call    Load_Logical
1D55 AF          14 7868                 Ret
1D56                7869                  
1D56 06 EE 01    10 7870 Sys_Inc_Blk:    Add     !rE,#$01 ;BlockNumber := BlockNumber + 1
1D59 16 ED 00    10 7871                 Adc     !rD,#0
1D5C 16 EC 00    10 7872                 Adc     !rC,#0
1D5F 2C 14        6 7873                  Ld     !r2,#.HIBYTE. LogicalBlock
1D61 3C A1        6 7874                  Ld     !r3,#.LOWBYTE. LogicalBlock
1D63 1C 03        6 7875                  Ld     !r1,#3
1D65 0C 1C        6 7876                  Ld     !r0,#Wrk_Sys+$0C
1D67 93 02       18 7877 Sys_Inc_Lp:     Ldei    @!!r2,@!r0
1D69 1A FC          7878                 Djnz    !r1,Sys_Inc_Lp
1D6B                7879                 
1D6B D6 16 6A    20 7880                 Call    Srch_Cache      ;get the new physical adr
1D6E 76 5A C0    10 7881                 Tm      BlkStat,#CachSeek+CachHdChg ;check for Head change
1D71 AF          14 7882                 Ret
1D72                7883                 
1D72                7884                 .LSTOFF
1D72                7886                 .LSTON























        WIDGET.ASSEM            Page 248
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1D72                7887                 .Page
1D72                7888 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1D72                7889 ;>
1D72                7890 ;>      Procedure: Sys_Write
1D72                7891 ;>
1D72                7892 ;>      This procedure is the System Write command for Widget. In 
1D72                7893 ;>      general it is a major departure from the ProFile write
1D72                7894 ;>      protocol: Status is not sent back to the host unless
1D72                7895 ;>      there is useful information in that status - the fact that
1D72                7896 ;>      there were no errors in a block transfer is communicated
1D72                7897 ;>      to the host via Response Byte that is handshaken across
1D72                7898 ;>      at CMD/BSY time. If an error has occured, than the host
1D72                7899 ;>      is to recognize this state and come back to read the status
1D72                7900 ;>      from the controller, otherwise it is assumed that the next
1D72                7901 ;>      thing that the controller wants is write data. Note that
1D72                7902 ;>      the second handshake ( data received acknowledgment )
1D72                7903 ;>      has been removed from this protocol.
1D72                7904 ;>
1D72                7905 ;>      Inputs: { none }
1D72                7906 ;>
1D72                7907 ;>      Outputs: { none }
1D72                7908 ;>
1D72                7909 ;>      Algorithm:
1D72                7910 ;>
1D72                7911 ;>      BEGIN
1D72                7912 ;>       Ld_LgclBlk( Wid_Log_Offset )
1D72                7913 ;>       Count := Ld_Param1.FirstParam
1D72                7914 ;>       BlockNumber := Load_Logical
1D72                7915 ;>       ClrNormStat
1D72                7916 ;>       BlockNumber := BlockNumber
1D72                7917 ;>       Get_Type_Check( BlockNumber + Count )
1D72                7918 ;>       Seek_Type := Access_Offset
1D72                7919 ;>       DiskStat.Wr_Op := True
1D72                7920 ;>       OverLap
1D72                7921 ;>       IF NOT( ReadBlock )
1D72                7922 ;>        THEN 
1D72                7923 ;>              SS_RdErr
1D72                7924 ;>              Goto Pro_Rd_Exit
1D72                7925 ;>       WHILE Always DO
1D72                7926 ;>              BlockNumber := BlockNumber + 1
1D72                7927 ;>              IF NOT( Srch_Cache )
1D72                7928 ;>               THEN OverLap
1D72                7929 ;>              IF NOT( Write_Common )
1D72                7930 ;>               THEN Data_Ex_Handler( Wr_Common.Error.Code )
1D72                7931 ;>              IF NOT( Read_Fast )
1D72                7932 ;>               THEN Goto Pro_Rd_Exit
1D72                7933 ;>               ELSE
1D72                7934 ;>                IF BlkStat.Bad_Block
1D72                7935 ;>                 THEN GoTo Pro_Rd_BB
1D72                7936 ;>              IF ( Count > 1 )
1D72                7937 ;>               THEN 
1D72                7938 ;>                    Command_Pending,IBsy := True, Response := Sys_Wr_Resp
1D72                7939 ;>                    Rd_Leave2
1D72                7940 ;>               ELSE Rd_Leave





        WIDGET.ASSEM            Page 249
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1D72                7941 ;>              Count := Count - 1
1D72                7942 ;>      END
1D72                7943 ;>
1D72                7944 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1D72                7945                 .LSTOFF
1D72                7948                 .LSTON





















































        WIDGET.ASSEM            Page 250
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1D72                7949                 .Page
1D72                7950                 .FIN
1D72                7951 
1D72                7952 Sys_Write:
1D72 E6 0A 23    10 7953                  Ld     Wrk_Io+$A,#Sys_Wr_Resp
1D75 D6 1D 0D    20 7954                 Call    Sys_SetUp
1D78                7955                 
1D78 E6 57 90    10 7956 Sys_Wr_Seek:     Ld     Seek_Type,#Access+Offset
1D7B 46 56 20    10 7957                  Or     DiskStat,#Wr_Op
1D7E D6 1D 47    20 7958                 Call    Sys_Rw_Seek
1D81 76 5A 02    10 7959                 Tm      BlkStat,#B_Block ;check if bad block
1D84 EB 57          7960                 Jr      Nz,Sys_Wr_BB
1D86                7961                 
1D86 D6 1D E2    20 7962                 Call    WriteBlock
1D89 EB 1C          7963                 Jr      Nz,Sys_Wr_Next
1D8B 8B 39          7964                 Jr      Sys_WrErr
1D8D                7965                 
1D8D D6 1D 56    20 7966 Sys_Wr_Lp:      Call    Sys_Inc_Blk
1D90 EB E6          7967                 Jr      Nz,Sys_Wr_Seek
1D92                7968                 
1D92 76 56 01    10 7969                 Tm      DiskStat,#Offset_On ;check for offset on all writes
1D95 6B E1          7970                 Jr      Z,Sys_Wr_Seek
1D97                7971                 
1D97 56 E0 3F    10 7972                 And     !r0,#$3F ;mask off head value
1D9A 09 55        6 7973                 Ld      Sector,!r0
1D9C                7974 
1D9C 76 5A 02    10 7975 Sys_Wr_OvrLp:   Tm      BlkStat,#B_Block ;check if bad block
1D9F ED 1D DD*43    7976                 Jp      Nz,Sys_Wr_BB
1DA2                7977                 
1DA2 D6 1E 06    20 7978                 Call    Write_Fast
1DA5 6B 1F          7979                 Jr      Z,Sys_WrErr
1DA7                7980                 
1DA7 E6 0A 23    10 7981 Sys_Wr_Next:    Ld      Wrk_Io+$A,#Sys_Wr_Resp
1DAA E6 0B E0    10 7982                 Ld      Wrk_Io+$B,#Cmnd_Pending+IBsy+MultiWr
1DAD E6 0C 10    10 7983                 Ld      Wrk_Io+$C,#.HIBYTE. WBuffer1
1DB0 E6 0D 21    10 7984                 Ld      Wrk_Io+$D,#.LOWBYTE. WBuffer1
1DB3 4A 0C          7985                 Djnz    !r4,Sys_Wr_More
1DB5                7986                 
1DB5 E6 0A 27    10 7987                  Ld     Wrk_Io+$A,#Sys_WrEnd_Resp
1DB8 E6 0B C0    10 7988 Sys_Wr_HS:       Ld     Wrk_Io+$B,#Cmnd_Pending+IBsy
1DBB D6 12 CF    20 7989                 Call    Rd_Leave2
1DBE 8D 12 CA       7990                 Jp      Rd_Leave
1DC1                7991                 
1DC1 D6 02 5F    20 7992 Sys_Wr_More:    Call    Clr_Bsy
1DC4 8B C7          7993                 Jr      Sys_Wr_Lp
1DC6                7994                 
1DC6                7995                 
1DC6 D6 18 DB    20 7996 Sys_WrErr:      Call    Wr_Common ;retry for exception handling
1DC9 EB DC          7997                 Jr      Nz,Sys_Wr_Next
1DCB                7998                 
1DCB D6 16 BD    20 7999                 Call    Data_Ex_Handler
1DCE D6 1D 03    20 8000 Sys_WrChk:      Call    Chk_FatalStat
1DD1 EB 05          8001                 Jr      Nz,Sys_WrE1
1DD3                8002                 





        WIDGET.ASSEM            Page 251
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1DD3 D6 1E 89    20 8003                 Call    ClrNormStat
1DD6 8B CF          8004                 Jr      Sys_Wr_Next
1DD8                8005 
1DD8 E6 0A A3    10 8006 Sys_WrE1:       Ld      Wrk_Io+$A,#Sys_WrEx_Resp
1DDB 8B DB          8007                 Jr      Sys_Wr_HS
1DDD                8008 
1DDD D6 18 CE    20 8009 Sys_Wr_BB:      Call    Wr_BBlock
1DE0 8B EC          8010                 Jr      Sys_WrChk
1DE2                8011                 
1DE2                8012                 .LSTOFF
1DE2                8017                 .LSTON
















































        WIDGET.ASSEM            Page 252
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1DE2                8018                 .Page
1DE2                8019 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1DE2                8020 ;>
1DE2                8021 ;>      Module: Write Routines
1DE2                8022 ;>
1DE2                8023 ;>      This module contains all but the very most primitive of
1DE2                8024 ;>      of procedures ( the routines that are resident are listed
1DE2                8025 ;>      in the external spec's ) that concern themselves with performing
1DE2                8026 ;>      a read operation.
1DE2                8027 ;>
1DE2                8028 ;>      FUNCTION WriteBlock( Parent : BYTE { !r8 } ) :
1DE2                8029 ;>                         BOOLEAN
1DE2                8030 ;>                         Status : BYTE { !r0 }
1DE2                8031 ;>                         WrErrCnt : BYTE { !r1 }
1DE2                8032 ;>
1DE2                8033 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1DE2                8034                 .LSTOFF
1DE2                8037                 .LSTON









































        WIDGET.ASSEM            Page 253
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1DE2                8038                 .Page
1DE2                8039 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1DE2                8040 ;>
1DE2                8041 ;>      Function: WriteBlock
1DE2                8042 ;>
1DE2                8043 ;>      This function assumes that the heads are positioned over the
1DE2                8044 ;>      correct track and writes the block of data whose header
1DE2                8045 ;>      matches the header that is made up of the cylinder, head
1DE2                8046 ;>      and sector information that is stored in memory.
1DE2                8047 ;>
1DE2                8048 ;>      Inputs:
1DE2                8049 ;>              Parent : BYTE { !r8 }
1DE2                8050 ;>
1DE2                8051 ;>      Outputs:
1DE2                8052 ;>              WriteBlock : BOOLEAN { Zero flag, true if error in ReadBlock }
1DE2                8053 ;>              Status     : BYTE { !r0 }
1DE2                8054 ;>              WrErrCnt   : BYTE { !r1 }
1DE2                8055 ;>
1DE2                8056 ;>      Global Variables Used:
1DE2                8057 ;>              Cylinder, Head, Sector, Recovery
1DE2                8058 ;>
1DE2                8059 ;>      Local Variables Used:
1DE2                8060 ;>              WrRetryCnt : BYTE { !r8 }
1DE2                8061 ;>              WrError    : BOOLEAN { !r9/bit 7 }
1DE2                8062 ;>              WrExcept   : BOOLEAN { !r9/bit 6 }
1DE2                8063 ;>              WrSuccess  : BOOLEAN { !r9/bit 5 }
1DE2                8064 ;>              NoHeaderFound : BOOLEAN { !r9/bit 4 }
1DE2                8065 ;>              SectorsRead: BYTE { !rA }
1DE2                8066 ;>
1DE2                8067 ;>      Algorithm:
1DE2                8068 ;>
1DE2                8069 ;>      BEGIN
1DE2                8070 ;>       SetDeadManTimer( WriteBlock, Parent )
1DE2                8071 ;>       WrRetryCnt := 10
1DE2                8072 ;>       WrErrCnt := 0
1DE2                8073 ;>       WrError := False
1DE2                8074 ;>       WrExcept := False
1DE2                8075 ;>       NoHeaderFound := False
1DE2                8076 ;>       REPEAT
1DE2                8077 ;>         WHeader[ 1 ] := HiCylinder
1DE2                8078 ;>         WHeader[ 2 ] := LoCylinder
1DE2                8079 ;>         WHeader[ 3 ]/bits 7:6 := Head
1DE2                8080 ;>         WHeader[ 3 ]/bits 5:0 := Sector
1DE2                8081 ;>         WHeader[ 4 ] := Invert( WHeader[ 1 ] )
1DE2                8082 ;>         WHeader[ 5 ] := Invert( WHeader[ 2 ] )
1DE2                8083 ;>         WHeader[ 6 ] := Invert( WHeader[ 3 ] )
1DE2                8084 ;>         WDataSync := $0001
1DE2                8085 ;>       _
1DE2                8086 ;>      /
1DE2                8087 ;>   R  |  Set-up external ram address counter for WRITE
1DE2                8088 ;>   E  |  Msel0:1 := Disk <--> Mem
1DE2                8089 ;>   S  |  WHILE SectorMark DO BEGIN END
1DE2                8090 ;>   I  |  StartL := True
1DE2                8091 ;>   D  |  WHILE NOT( SectorDnL ) DO BEGIN END





        WIDGET.ASSEM            Page 254
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1DE2                8092 ;>   E  |  Status := Status_Port
1DE2                8093 ;>   N  |  StartL := False
1DE2                8094 ;>   T  |  Msel0:1 := Z8 <--> Mem
1DE2                8095 ;>      \_
1DE2                8096 ;>
1DE2                8097 ;>         CASE Status.State OF
1DE2                8098 ;>              NormalEndState        : WrStat.WrSuccessful := True
1DE2                8099 ;>
1DE2                8100 ;>              NoMatchingHeaderFound : WrStat.WrSuccessful := False
1DE2                8101 ;>                                      WrStat.WrError := True
1DE2                8102 ;>                                      WrStat.NoHeaderFound := True
1DE2                8103 ;>
1DE2                8104 ;>              AbnormalState         : Reset_StateMachine
1DE2                8105 ;>                                      Abort
1DE2                8106 ;>
1DE2                8107 ;>         IF Status.ServoErr OR NOT( Status.ServoRdy )
1DE2                8108 ;>          THEN
1DE2                8109 ;>               WrStat.WrError := True
1DE2                8110 ;>               WrStat.Except := True
1DE2                8111 ;>
1DE2                8112 ;>         IF Status.WrtNvldL  AND WrSuccessful
1DE2                8113 ;>          THEN
1DE2                8114 ;>              WrStat.WrError := True
1DE2                8115 ;>              WrStat.WrErrCnt := WrErrCnt + 1
1DE2                8116 ;>              WrRetryCnt := WrRetryCnt - 1
1DE2                8117 ;>          ELSE
1DE2                8118 ;>              RdRetryCnt := 0
1DE2                8119 ;>
1DE2                8120 ;>       UNTIL NOT( Recovery ) OR NOT( WrError ) OR ( WrRetryCnt = 0 ) OR
1DE2                8121 ;>                      WrExcept OR ( NoHeaderFound )
1DE2                8122 ;>       ClearDeadManTimer
1DE2                8123 ;>      END
1DE2                8124 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1DE2                8125                 .LSTOFF
1DE2                8128                 .LSTON
























        WIDGET.ASSEM            Page 255
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1DE2                8129                 .Page
1DE2                8130                 .FIN
1DE2                8131                 
1DE2                8132 WriteBlock:
1DE2 B0 E9        6 8133                 Clr     !r9     ;clear booleans
1DE4 8C 0A        6 8134                 Ld      !r8,#10 ;WrRetryCnt := 10
1DE6 B0 EB        6 8135                 Clr     !rB     ;ErrCnt := 0
1DE8 46 56 20    10 8136                 Or      DiskStat,#Wr_Op ;make certain we are writing
1DEB                8137                  
1DEB 2C 10        6 8138 WrBlk_Rpt:       Ld     !r2,#.HIBYTE. WHeader ;initialize gaps
1DED 3C 0B        6 8139                  Ld     !r3,#.LOWBYTE. WHeader
1DEF D6 05 E1    20 8140                 Call    Load_Header
1DF2                8141 
1DF2 0C 00        6 8142                 Ld      !r0,#0
1DF4 1C 0E        6 8143                 Ld      !r1,#( WDataSync - WDataGap )
1DF6 92 02       12 8144 WrGap_Lp:       Lde     @!!r2,!r0
1DF8 3E           6 8145                 Inc     !r3
1DF9 1A FB          8146                 Djnz    !r1,WrGap_Lp
1DFB                8147                 
1DFB 0C 01        6 8148                 Ld      !r0,#01
1DFD 92 02       12 8149                 Lde     @!!r2,!r0       ;first byte of sync
1DFF 3E           6 8150                 Inc     !r3
1E00 0C 00        6 8151                 Ld      !r0,#$00
1E02 92 02       12 8152                 Lde     @!!r2,!r0       ;second byte of sync
1E04 8B 1E          8153                 Jr      Do_Write
1E06                8154 
1E06 B0 E9        6 8155 Write_Fast:     Clr     !r9     ;clear booleans
1E08 8C 0A        6 8156                 Ld      !r8,#10 ;WrRetryCnt := 10
1E0A B0 EB        6 8157                 Clr     !rB     ;ErrCnt := 0
1E0C 46 56 20    10 8158                 Or      DiskStat,#Wr_Op ;make certain we are writing
1E0F                8159                  
1E0F 2C 10        6 8160                 Ld      !r2,#.HIBYTE. ( WHeader+2 ) ;get Sector location
1E11 3C 0D        6 8161                 Ld      !r3,#.LOWBYTE. ( WHeader+2 )
1E13 82 02       12 8162                 Lde     !r0,@!!r2 ;get current Head/Sector Value
1E15 56 E0 C0    10 8163                 And     !r0,#$C0 ;mask ols sector value
1E18 44 55 E0    10 8164                 Or      !r0,Sector ;merge new sector value
1E1B 92 02       12 8165                 Lde     @!!r2,!r0 ;store it in header
1E1D 06 E3 03    10 8166                 Add     !r3,#3 ;get location of Inverse Sector
1E20 60 E0        6 8167                 Com     !r0
1E22 92 02       12 8168                 Lde     @!!r2,!r0 ;and store it!
1E24                8169                 
1E24 D6 03 0C    20 8170 Do_Write:       Call    Wr_Resident     ;go internal to the Z8
1E27                8171 
1E27 18 E0        6 8172                 Ld      !r1,!r0         ;CASE Status.State
1E29 56 E1 0F    10 8173                 And     !r1,#$0F
1E2C 42 AA        6 8174                 Or      !rA,!rA
1E2E 6B 43          8175                 Jr      Z,WrBlk_NoHdr
1E30 A6 E1 02    10 8176                 Cp      !r1,#Norm_State
1E33 EB 36          8177                 Jr      Nz,WrBlk_AbNorm
1E35                8178                 
1E35 46 E9 20    10 8179 WrBlk_Norm:     Or      !r9,#WrSuccess
1E38                8180 
1E38 18 E0        6 8181                 Ld      !r1,!r0         ;IF ServorErr OR NOT( ServoRdy )
1E3A 76 E1 10    10 8182                 Tm      !r1,#ServoErr





        WIDGET.ASSEM            Page 256
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1E3D EB 3F          8183                 Jr      Nz,Wr_ServoErr
1E3F 76 E1 20    10 8184                 Tm      !r1,#ServoRdy
1E42 6B 3A          8185                 Jr      Z,Wr_ServoErr
1E44                8186                 
1E44 76 E0 40    10 8187 Wr_ServoOk:     Tm      !r0,#WrtNvldL    ;IF Status.WrtNtVldL
1E47 6B 3A          8188                 Jr      Z,WrBlk_NVld
1E49                8189                 
1E49 56 E9 7F    10 8190                 And     !r9,#$FF-WrError
1E4C                8191                 
1E4C 76 24 80    10 8192 WrBlk_Until:    Tm      Excpt_Status,#Recovery
1E4F 6B 07          8193                 Jr      Z,WrBlk_End
1E51 76 E9 80    10 8194                 Tm      !r9,#WrError
1E54 6B 02          8195                 Jr      Z,WrBlk_End
1E56 8A 0A          8196                 Djnz    !r8,WrB_Rpt1
1E58                8197                 
1E58 B9 29        6 8198 WrBlk_End:      Ld      WrErrCnt,!rB
1E5A 08 E9        6 8199                 Ld      !r0,!r9 ;send status back to caller
1E5C 99 28        6 8200                 Ld      WrStat,!r9
1E5E 66 E0 80    10 8201                 Tcm     !r0,#WrError ;set zero flag if error
1E61 AF          14 8202                 Ret
1E62                8203                 
1E62                8204                 
1E62 2C 22        6 8205 WrB_Rpt1:        Ld     !r2,#.HIBYTE. ZeroHeader
1E64 3C 91        6 8206                  Ld     !r3,#.LOWBYTE. ZeroHeader
1E66 D6 04 AB    20 8207                 Call    Bank_Call
1E69 8B 80          8208                 Jr      WrBlk_Rpt
1E6B                8209                 
1E6B D6 05 AE    20 8210 WrBlk_AbNorm:    Call   Reset_StMach
1E6E A8 E0        6 8211                  Ld     !rA,!r0
1E70 D6 05 1F    20 8212                 Call    Abort
1E73                8213                 
1E73 56 E9 DF    10 8214 WrBlk_NoHdr:    And     !r9,#$FF-WrSuccess
1E76 46 E9 90    10 8215 Wr_HdrErr:      Or      !r9,#WrNoHdrFnd + WrError
1E79 46 EB 20    10 8216                 Or      !rB,#Hdr_MisMatch
1E7C 8B DA          8217                 Jr      WrBlk_End
1E7E                8218                 
1E7E 46 E9 C0    10 8219 Wr_ServoErr:    Or      !r9,#WrError + WrSrvoErr ; THEN WrError AND WrSrvoErr
1E81 8B D5          8220                 Jr      WrBlk_End
1E83                8221                 
1E83 46 E9 80    10 8222 WrBlk_NVld:     Or      !r9,#WrError    ; ELSE
1E86 BE           6 8223                 Inc     !rB
1E87 8B C3          8224                 Jr      WrBlk_Until
1E89                8225                 
1E89                8226                 .LSTOFF
1E89                8231                 .LSTON














        WIDGET.ASSEM            Page 257
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1E89                8232                 .Page
1E89                8233 ;>>>>>>>>>>>>>>>>>>>>>>>>
1E89                8234 ;>
1E89                8235 ;>      Module: Utilities
1E89                8236 ;>
1E89                8237 ;>      This module contains all the routines that do not fall
1E89                8238 ;>      logically into any specific grouping, yet are essential
1E89                8239 ;>      to the program.
1E89                8240 ;>
1E89                8241 ;>      PROCEDURE ClrNormStat
1E89                8242 ;>      PROCEDURE Move4( Source : PTR { !!r2 }
1E89                8243 ;>                       Destination : PTR { !!rE }
1E89                8244 ;>                     )
1E89                8245 ;>
1E89                8246 ;>>>>>>>>>>>>>>>>>>>>>>>>
1E89                8247                 .LSTOFF
1E89                8250                 .LSTON










































        WIDGET.ASSEM            Page 258
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1E89                8251                 .Page
1E89                8252 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1E89                8253 ;>
1E89                8254 ;>      Procedure: ClrNormStat
1E89                8255 ;>
1E89                8256 ;>      This procedure clears all the bytes within standard status.
1E89                8257 ;>
1E89                8258 ;>      Inputs: { none }
1E89                8259 ;>
1E89                8260 ;>      Outputs: { none }
1E89                8261 ;>
1E89                8262 ;>      Algorithm:
1E89                8263 ;>
1E89                8264 ;>      BEGIN
1E89                8265 ;>       FOR i := 1 TO Length( StandardStatus ) DO
1E89                8266 ;>        StandardStatus[ i ] := 0
1E89                8267 ;>       IF ( Excpt_Stat.SprTbl_Warn )
1E89                8268 ;>        THEN SS_SprWarn
1E89                8269 ;>       IF ( Excpt_Stat.PwrRst )
1E89                8270 ;>        THEN 
1E89                8271 ;>              SetStatus( PowerResest )
1E89                8272 ;>              Excpt_Stat.PwrRst := False
1E89                8273 ;>      END
1E89                8274 ;>
1E89                8275 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1E89                8276                 .LSTOFF
1E89                8279                 .LSTON
































        WIDGET.ASSEM            Page 259
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1E89                8280                 .Page
1E89                8281                 .FIN
1E89                8282 
1E89                8283 ClrNormStat:
1E89 2C 14        6 8284                 Ld      !r2,#.HIBYTE. CStatus0
1E8B 3C 95        6 8285                 Ld      !r3,#.LOWBYTE. CStatus0
1E8D B0 E0        6 8286                 Clr     !r0
1E8F 1C 04        6 8287                 Ld      !r1,#( CStatus1 - CStatus0 ) ;clear all status bytes
1E91                8288                 
1E91 92 02       12 8289 Clr_N_Stat:     Lde     @!!r2,!r0
1E93 A0 E2       10 8290                 Incw    !!r2
1E95 1A FA          8291                 Djnz    !r1,Clr_N_Stat
1E97                8292                 
1E97 76 24 40    10 8293                 Tm      Excpt_Stat,#SprTbl_Warn
1E9A 6B 03          8294                 Jr      Z,Clr_N_PwrRst
1E9C                8295                 
1E9C D6 05 A8    20 8296                 Call    SS_SprWarn
1E9F                8297                 
1E9F 76 24 10    10 8298 Clr_N_PwrRst:   Tm      Excpt_Stat,#PwrRst
1EA2 6B 0A          8299                 Jr      Z,Clr_N_SlfTst
1EA4                8300                 
1EA4 0C 02        6 8301                  Ld     !r0,#2 ;byte 2
1EA6 1C 80        6 8302                  Ld     !r1,#Power_Reset
1EA8 D6 04 03    20 8303                 Call    SetStatus
1EAB 56 24 EF    10 8304                 And     Excpt_Stat,#$FF-PwrRst
1EAE                8305                 
1EAE 44 25 25    10 8306 Clr_N_SlfTst:   Or      SlfTst_Result,SlfTst_Result
1EB1 6B 07          8307                 Jr      Z,Clr_N_Leave
1EB3                8308                 
1EB3 0C 01        6 8309                  Ld     !r0,#01 ;byte 1
1EB5 1C 08        6 8310                  Ld     !r1,#Stat_SlfTst
1EB7 D6 04 03    20 8311                 Call    SetStatus
1EBA                8312                 
1EBA 8D 04 F8       8313 Clr_N_Leave:    Jp      Bank_Ret
1EBD                8314 
1EBD                8315                 .LSTOFF
1EBD                8317                 .LSTON






















        WIDGET.ASSEM            Page 260
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1EBD                8318                 .Page
1EBD                8319 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1EBD                8320 ;>
1EBD                8321 ;>      Procedure: Move4_B0
1EBD                8322 ;>
1EBD                8323 ;>      This procedure is used to move 4 bytes from the souce to the
1EBD                8324 ;>      destination.
1EBD                8325 ;>
1EBD                8326 ;>      Inputs:
1EBD                8327 ;>              Source : PTR { !!r2 }
1EBD                8328 ;>              Destination : PTR { !!rE }
1EBD                8329 ;>
1EBD                8330 ;>      Outputs: { none }
1EBD                8331 ;>
1EBD                8332 ;>      Algorithm:
1EBD                8333 ;>
1EBD                8334 ;>      BEGIN
1EBD                8335 ;>       FOR i := 0 TO 3 DO
1EBD                8336 ;>        @Destination( i ) := @Source( i )
1EBD                8337 ;>      END
1EBD                8338 ;>
1EBD                8339 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1EBD                8340                 .LSTOFF
1EBD                8343                 .LSTON



































        WIDGET.ASSEM            Page 261
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1EBD                8344                 .Page
1EBD                8345                 .FIN
1EBD                8346 
1EBD                8347 Move4_B0:
1EBD 1C 04        6 8348                 Ld      !r1,#4
1EBF 82 02       12 8349 Move4_B0_Lp:    Lde     !r0,@!!r2
1EC1 92 0E       12 8350                 Lde     @!!rE,!r0
1EC3 A0 E2       10 8351                 Incw    !!r2
1EC5 A0 EE       10 8352                 Incw    !!rE
1EC7 1A F6          8353                 Djnz    !r1,Move4_B0_Lp
1EC9                8354                 
1EC9 8D 04 F8       8355                 Jp      Bank_Ret
1ECC                8356                 
1ECC                8357                 .LSTOFF
1ECC                8362                 .LSTON












































        WIDGET.ASSEM            Page 262
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1ECC                8363                 .Page
1ECC                8364 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1ECC                8365 ;>
1ECC                8366 ;>      Module: Read Routines
1ECC                8367 ;>
1ECC                8368 ;>      This module contains all but the very most primitive of
1ECC                8369 ;>      of procedures ( the routines that are resident are listed
1ECC                8370 ;>      in the external spec's ) that concern themselves with performing
1ECC                8371 ;>      a read operation.
1ECC                8372 ;>
1ECC                8373 ;>      FUNCTION ReadBlock( Parent : BYTE { !r8 } ) :
1ECC                8374 ;>                        BOOLEAN
1ECC                8375 ;>                        Status : BYTE { !r0 }
1ECC                8376 ;>                        RdErrCnt : BYTE { !r1 }
1ECC                8377 ;>
1ECC                8378 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1ECC                8379                 .LSTOFF
1ECC                8382                 .LSTON









































        WIDGET.ASSEM            Page 263
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1ECC                8383                 .Page
1ECC                8384 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1ECC                8385 ;>
1ECC                8386 ;>      Function: ReadBlock
1ECC                8387 ;>
1ECC                8388 ;>      This function assumes that the heads are positioned over the
1ECC                8389 ;>      correct track and reads the block of data whose header
1ECC                8390 ;>      matches the header that is made up of the cylinder, head
1ECC                8391 ;>      and sector information that is stored in memory.
1ECC                8392 ;>
1ECC                8393 ;>      Inputs:
1ECC                8394 ;>              Parent : BYTE { !r8 }
1ECC                8395 ;>
1ECC                8396 ;>      Outputs:
1ECC                8397 ;>              ReadBlock : BOOLEAN { Zero flag, true if error in ReadBlock }
1ECC                8398 ;>              Status    : BYTE { !r0 }
1ECC                8399 ;>              RdErrCnt  : BYTE { !r1 }
1ECC                8400 ;>
1ECC                8401 ;>      Global Variables Used:
1ECC                8402 ;>              Cylinder, Head, Sector, Recovery
1ECC                8403 ;>
1ECC                8404 ;>      Local Variables Used:
1ECC                8405 ;>              RdRetryCnt : BYTE { !r8 }
1ECC                8406 ;>              RdError    : BOOLEAN { !r9/bit 7 }
1ECC                8407 ;>              RdExcept   : BOOLEAN { !r9/bit 6 }
1ECC                8408 ;>              RdSuccess  : BOOLEAN { !r9/bit 5 }
1ECC                8409 ;>              NoHdrFound : BOOLEAN { !r9/bit 4 }
1ECC                8410 ;>              SectorsRead: BYTE { !rA }
1ECC                8411 ;>
1ECC                8412 ;>      Algorithm:
1ECC                8413 ;>
1ECC                8414 ;>      BEGIN
1ECC                8415 ;>       SetDeadManTimer( ReadBlock, Parent )
1ECC                8416 ;>       RdRetryCnt := 10
1ECC                8417 ;>       RdErrCnt := 0
1ECC                8418 ;>       RdError := False
1ECC                8419 ;>       RdExcept := False
1ECC                8420 ;>       NoHeaderFound := False
1ECC                8421 ;>       SectorsRead := 2 * NbrSctrs { try to find header for two rotations }
1ECC                8422 ;>       REPEAT
1ECC                8423 ;>         RHeader[ 1 ] := HiCylinder
1ECC                8424 ;>         RHeader[ 2 ] := LoCylinder
1ECC                8425 ;>         RHeader[ 3 ]/bits 7:6 := Head
1ECC                8426 ;>         RHeader[ 3 ]/bits 5:0 := Sector
1ECC                8427 ;>         RHeader[ 4 ] := Invert( RHeader[ 1 ] )
1ECC                8428 ;>         RHeader[ 5 ] := Invert( RHeader[ 2 ] )
1ECC                8429 ;>         RHeader[ 6 ] := Invert( RHeader[ 3 ] )
1ECC                8430 ;>         ReadArray[ RDummy-1 ] := 0
1ECC                8431 ;>       _
1ECC                8432 ;>      /
1ECC                8433 ;>   R  |  Set-up external ram address counter for READ
1ECC                8434 ;>   E  |  Msel0:1 := Disk <--> Mem
1ECC                8435 ;>   S  |  WHILE SectorMark DO BEGIN END
1ECC                8436 ;>   I  |  StartL := True





        WIDGET.ASSEM            Page 264
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1ECC                8437 ;>   D  |  WHILE NOT( SectorDnL ) DO BEGIN END
1ECC                8438 ;>   E  |  Status := Status_Port
1ECC                8439 ;>   N  |  StartL := False
1ECC                8440 ;>   T  |  Msel0:1 := Z8 <--> Mem
1ECC                8441 ;>      \_
1ECC                8442 ;>
1ECC                8443 ;>         CASE Status.State OF
1ECC                8444 ;>              NormalEndState        : RdSuccess := True
1ECC                8445 ;>
1ECC                8446 ;>              NoMatchingHeaderFound : RdSuccess := False
1ECC                8447 ;>                                      RdError := True
1ECC                8448 ;>                                      NoHeaderFound := True
1ECC                8449 ;>
1ECC                8450 ;>              AbnormalState         : Reset_StateMachine
1ECC                8451 ;>                                      Abort
1ECC                8452 ;>
1ECC                8453 ;>         IF Status.ServoErr OR NOT( Status.ServoRdy )
1ECC                8454 ;>          THEN
1ECC                8455 ;>               RdError := True
1ECC                8456 ;>               RdExcept := True
1ECC                8457 ;>
1ECC                8458 ;>         IF Status.CrcErr AND RdSuccess
1ECC                8459 ;>          THEN
1ECC                8460 ;>              RdError := True
1ECC                8461 ;>              RdErrCnt := RdErrCnt + 1
1ECC                8462 ;>              RdRetryCnt := RdRetryCnt - 1
1ECC                8463 ;>          ELSE
1ECC                8464 ;>              IF RdError
1ECC                8465 ;>               THEN
1ECC                8466 ;>                   BlockMove( Buffer2, RBuffer1 )
1ECC                8467 ;>                   RdRetryCnt := RdRetryCnt - 1
1ECC                8468 ;>
1ECC                8469 ;>
1ECC                8470 ;>       UNTIL NOT( Recovery ) OR NOT( RdError ) OR ( RdRetryCnt = 0 ) OR
1ECC                8471 ;>                      RdExcept OR ( NoHeaderFound )
1ECC                8472 ;>       ClearDeadManTimer
1ECC                8473 ;>       Status := !r9
1ECC                8474 ;>      END
1ECC                8475 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1ECC                8476                 .LSTOFF
1ECC                8479                 .LSTON


















        WIDGET.ASSEM            Page 265
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1ECC                8480                 .Page
1ECC                8481                 .FIN
1ECC                8482                 
1ECC                8483 ReadBlock:
1ECC B0 E9        6 8484                 Clr     !r9     ;clear booleans
1ECE 8C 0A        6 8485                 Ld      !r8,#10 ;RdRetryCnt := 10
1ED0 B0 EB        6 8486                 Clr     !rB     ;ErrCnt := 0
1ED2 56 56 DF    10 8487                 And     DiskStat,#$FF-Wr_Op ;make certain we are reading
1ED5                8488 
1ED5 2C 10        6 8489 RdBlk_Rpt:       Ld     !r2,#.HIBYTE. RHeader ;initialize gaps
1ED7 3C 0B        6 8490                  Ld     !r3,#.LOWBYTE. RHeader
1ED9 D6 05 E1    20 8491                 Call    Load_Header
1EDC 0C 00        6 8492                 Ld      !r0,#0
1EDE 92 02       12 8493                 Lde     @!!r2,!r0
1EE0                8494                 
1EE0 2C 10        6 8495                 Ld      !r2,#.HIBYTE. ( RDummy-1 )
1EE2 3C 17        6 8496                 Ld      !r3,#.LOWBYTE. ( RDummy-1 )
1EE4 92 02       12 8497                 Lde     @!!r2,!r0
1EE6 A0 E2       10 8498                 Incw    !!r2
1EE8 92 02       12 8499                 Lde     @!!r2,!r0
1EEA 8B 1E          8500                 Jr      Do_Read
1EEC                8501                 
1EEC B0 E9        6 8502 Read_Fast:      Clr     !r9     ;clear booleans
1EEE 8C 0A        6 8503                 Ld      !r8,#10 ;RdRetryCnt := 10
1EF0 B0 EB        6 8504                 Clr     !rB     ;ErrCnt := 0
1EF2 56 56 DF    10 8505                 And     DiskStat,#$FF-Wr_Op ;make certain we are reading
1EF5                8506                 
1EF5 2C 10        6 8507                 Ld      !r2,#.HIBYTE. ( RHeader+2 ) ;get location of Sector
1EF7 3C 0D        6 8508                 Ld      !r3,#.LOWBYTE. ( RHeader+2 )
1EF9 82 02       12 8509                 Lde     !r0,@!!r2 ;get current Head/Sector value
1EFB 56 E0 C0    10 8510                 And     !r0,#$C0 ;mask out old sector value
1EFE 44 55 E0    10 8511                 Or      !r0,Sector ;merge in new sector
1F01 92 02       12 8512                 Lde     @!!r2,!r0 ;and store it
1F03 06 E3 03    10 8513                 Add     !r3,#3 ;get location of Inverse Head/Sector
1F06 60 E0        6 8514                 Com     !r0
1F08 92 02       12 8515                 Lde     @!!r2,!r0 ;and store it, too!
1F0A                8516                 
1F0A D6 03 46    20 8517 Do_Read:        Call    Rd_Resident     ;go internal to the Z8
1F0D                8518 
1F0D 18 E0        6 8519                 Ld      !r1,!r0         ;CASE Status.State
1F0F 56 E1 0F    10 8520                 And     !r1,#$0F
1F12 42 AA        6 8521                 Or      !rA,!rA
1F14 6B 49          8522                 Jr      Z,RdBlk_NoHdr
1F16 A6 E1 02    10 8523                 Cp      !r1,#Norm_State
1F19 EB 3C          8524                 Jr      Nz,RdBlk_AbNorm
1F1B                8525                 
1F1B 46 E9 20    10 8526 RdBlk_Norm:     Or      !r9,#RdSuccess
1F1E                8527 
1F1E 18 E0        6 8528                 Ld      !r1,!r0         ;IF ServorErr OR NOT( ServoRdy )
1F20 76 E1 10    10 8529                 Tm      !r1,#ServoErr
1F23 EB 57          8530                 Jr      Nz,Rd_ServoErr
1F25 76 E1 20    10 8531                 Tm      !r1,#ServoRdy
1F28 6B 52          8532                 Jr      Z,Rd_ServoErr
1F2A                8533                 





        WIDGET.ASSEM            Page 266
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1F2A 76 E0 80    10 8534 Rd_ServoOk:     Tm      !r0,#CrcErrL    ;IF Status.CrcErr
1F2D 6B 52          8535                 Jr      Z,Rd_BadCrc
1F2F 76 E0 40    10 8536                 Tm      !r0,#WrtNvldL   ; OR Status.EccErr
1F32 6B 6D          8537                 Jr      Z,Rd_BadEcc
1F34                8538                 
1F34 76 E9 80    10 8539 Rd_NoCrcErr:    Tm      !r9,#RdError    ; THEN IF RdError
1F37 EB 6E          8540                 Jr      Nz,RdBlk_Bmove
1F39                8541                 
1F39 76 24 80    10 8542 RdBlk_Until:    Tm      Excpt_Status,#Recovery
1F3C 6B 05          8543                 Jr      Z,RdBlk_End
1F3E 76 E9 80    10 8544                 Tm      !r9,#RdError
1F41 EB 0A          8545                 Jr      Nz,RdB_Rpt1
1F43                8546                 
1F43 B9 27        6 8547 RdBlk_End:      Ld      RdErrCnt,!rB
1F45 08 E9        6 8548                 Ld      !r0,!r9 ;send status back to caller
1F47 99 26        6 8549                 Ld      RdStat,!r9
1F49                8550                 
1F49 66 E0 80    10 8551                 Tcm     !r0,#RdError ;set zero flag if error
1F4C AF          14 8552                 Ret
1F4D                8553                 
1F4D                8554 
1F4D 2C 22        6 8555 RdB_Rpt1:        Ld     !r2,#.HIBYTE. ZeroHeader
1F4F 3C 91        6 8556                  Ld     !r3,#.LOWBYTE. ZeroHeader
1F51 D6 04 AB    20 8557                 Call    Bank_Call
1F54 8D 1E D5       8558                 Jp      RdBlk_Rpt
1F57                8559                 
1F57 D6 05 AE    20 8560 RdBlk_AbNorm:    Call   Reset_StMach
1F5A A8 E0        6 8561                  Ld     !rA,!r0
1F5C D6 05 1F    20 8562                 Call    Abort
1F5F                8563                 
1F5F 56 E9 DF    10 8564 RdBlk_NoHdr:    And     !r9,#$FF-RdSuccess
1F62 46 E9 80    10 8565                 Or      !r9,#Error
1F65 76 EB 20    10 8566                 Tm      !rB,#Hdr_MisMatch
1F68 EB 0D          8567                 Jr      Nz,Rd_HdrErr
1F6A 46 EB 20    10 8568                 Or      !rB,#Hdr_MisMatch
1F6D                8569                 
1F6D 76 24 80    10 8570                 Tm      Excpt_Stat,#Recovery ;auto offset ONLY if recovery on
1F70 6B C7          8571                 Jr      Z,RdBlk_Until
1F72                8572                 
1F72 D6 05 CA    20 8573                 Call    ReSeek              ;set auto_offset
1F75 8B C2          8574                 Jr      RdBlk_Until
1F77                8575                 
1F77 46 E9 90    10 8576 Rd_HdrErr:      Or      !r9,#RdNoHdrFnd + RdError
1F7A 8B C7          8577                 Jr      RdBlk_End
1F7C                8578                 
1F7C 46 E9 C0    10 8579 Rd_ServoErr:    Or      !r9,#RdError + RdSrvoErr ; THEN RdError AND RdServoErr
1F7F 8B C2          8580                 Jr      RdBlk_End
1F81                8581                 
1F81 46 E9 88    10 8582 Rd_BadCrc:      Or      !r9,#RdError+RdCrcErr    ; ELSE
1F84 BE           6 8583                 Inc     !rB
1F85 46 EB 40    10 8584                 Or      !rB,#CrcStat
1F88 76 E0 40    10 8585                 Tm      !r0,#WrtNvldL   ;check for Ecc error too
1F8B EB 10          8586                 Jr      Nz,Rd_B_Crc_1
1F8D 46 EB 80    10 8587 RD_Bad1:        Or      !rB,#EccStat





        WIDGET.ASSEM            Page 267
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1F90                8588                 
1F90 76 24 80    10 8589                 Tm      Excpt_Stat,#Recovery    ;ReSeek only if recovery is on
1F93 6B 08          8590                 Jr      Z,Rd_B_Crc_1
1F95                8591                 
1F95 76 56 01    10 8592                 Tm      DiskStat,#Offset_On ;set auto offset if needed
1F98 EB 03          8593                 Jr      Nz,Rd_B_Crc_1
1F9A                8594                 
1F9A D6 05 CA    20 8595                 Call    ReSeek
1F9D                8596 
1F9D 8A 9A          8597 Rd_B_Crc_1:     Djnz    !r8,RdBlk_Until
1F9F 8B A2          8598                 Jr      RdBlk_End
1FA1                8599                 
1FA1 46 E9 88    10 8600 Rd_BadEcc:      Or      !r9,#RdError+RdCrcErr
1FA4 BE           6 8601                 Inc     !rB
1FA5 8B E6          8602                 Jr      Rd_Bad1
1FA7                8603                 
1FA7 2C 20        6 8604 RdBlk_Bmove:     Ld     !r2,#.HIBYTE. RBuf_To_Buf2
1FA9 3C 8F        6 8605                  Ld     !r3,#.LOWBYTE. RBuf_To_Buf2
1FAB D6 04 AB    20 8606                 Call    Bank_Call
1FAE 8B ED          8607                 Jr      Rd_B_Crc_1
1FB0                8608                 
1FB0                8609                 .LSTOFF
1FB0                8616                 .LSTON




































        WIDGET.ASSEM            Page 268
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


1FB0                8617                 .Page
1FB0                8618                 .FIN
1FB0                8619                 
1FB0                8620                 .ORG    $2000 ;move this code into the eprom, bank 1
2000                8621                 
2000 00 00          8622                 .BLOCK  0,2   ;reserve two bytes for the checkbyte
2002 01             8623                 .DB     1     ;bank 1
2003 F0 78 3C 1E    8624                 .DB     $F0, $78, $3C, $1E
2007                8625                 .LSTOFF
2007                8631                 .LSTON

















































        WIDGET.ASSEM            Page 269
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2007                8632                 .Page
2007                8633 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2007                8634 ;>
2007                8635 ;>      Module: ReadHeader Routines
2007                8636 ;>
2007                8637 ;>      This module contains all but the very most primitive of
2007                8638 ;>      of procedures ( the routines that are resident are listed
2007                8639 ;>      in the external spec's ) that concern themselves with performing
2007                8640 ;>      a read operation.
2007                8641 ;>
2007                8642 ;>      FUNCTION ReadHdr( Parent : BYTE { !r8 } ) :
2007                8643 ;>                      BOOLEAN
2007                8644 ;>                      Status : BYTE { !r0 }
2007                8645 ;>
2007                8646 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2007                8647                 .LSTOFF
2007                8650                 .LSTON










































        WIDGET.ASSEM            Page 270
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2007                8651                 .Page
2007                8652 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2007                8653 ;>
2007                8654 ;>      Function: ReadHdr
2007                8655 ;>
2007                8656 ;>      This function assumes that the heads are positioned over the
2007                8657 ;>      correct track and reads the block of data following the
2007                8658 ;>      next sector mark. This routine is used for two reasons: 1) to
2007                8659 ;>      verify the header that is laid out on a block and 2) to try
2007                8660 ;>      to recover the data within a block if the header is munched.
2007                8661 ;>
2007                8662 ;>      Inputs:
2007                8663 ;>              Parent : BYTE { !r8 }
2007                8664 ;>
2007                8665 ;>      Outputs:
2007                8666 ;>              ReadHdr : BOOLEAN { Zero flag, true if error in ReadBlock }
2007                8667 ;>              Status    : BYTE { !r0 }
2007                8668 ;>
2007                8669 ;>      Global Variables Used:
2007                8670 ;>              Cylinder, Head, Sector
2007                8671 ;>
2007                8672 ;>      Local Variables Used:
2007                8673 ;>              RdHError    : BOOLEAN { !r9/bit 7 }
2007                8674 ;>              RdExcept   : BOOLEAN { !r9/bit 6 }
2007                8675 ;>
2007                8676 ;>      Algorithm:
2007                8677 ;>
2007                8678 ;>      BEGIN
2007                8679 ;>       SetDeadManTimer( ReadBlock, Parent )
2007                8680 ;>       RdHError := False
2007                8681 ;>       RdHExcept := False
2007                8682 ;>       RHSctrGap := 0
2007                8683 ;>       RHHdrGap := 0
2007                8684 ;>       _
2007                8685 ;>      /
2007                8686 ;>   R  |  Set-up external ram address counter for READHEADER
2007                8687 ;>   E  |  Msel0:1 := Disk <--> Mem
2007                8688 ;>   S  |  WHILE SectorMark DO BEGIN END
2007                8689 ;>   I  |  StartL := True
2007                8690 ;>   D  |  WHILE NOT( SectorDnL ) DO BEGIN END
2007                8691 ;>   E  |  Status := Status_Port
2007                8692 ;>   N  |  StartL := False
2007                8693 ;>   T  |  Msel0:1 := Z8 <--> Mem
2007                8694 ;>      \_
2007                8695 ;>
2007                8696 ;>         IF ( Status.State <> NormalEndState ) 
2007                8697 ;>          THEN 
2007                8698 ;>              Reset_StateMachine
2007                8699 ;>              Abort
2007                8700 ;>
2007                8701 ;>         IF Status.ServoErr OR NOT( Status.ServoRdy )
2007                8702 ;>          THEN
2007                8703 ;>               RdHError := True
2007                8704 ;>               RdHExcept := True





        WIDGET.ASSEM            Page 271
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2007                8705 ;>
2007                8706 ;>         IF Status.CrcErrL THEN RdHError := True
2007                8707 ;>
2007                8708 ;>       ClearDeadManTimer
2007                8709 ;>       Status/bit 7 := RdHError
2007                8710 ;>       Status/bit 6 := RdHExcept
2007                8711 ;>      END
2007                8712 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2007                8713                 .LSTOFF
2007                8716                 .LSTON

















































        WIDGET.ASSEM            Page 272
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2007                8717                 .Page
2007                8718                 .FIN
2007                8719                 
2007                8720 ReadHdr:
2007 56 56 DF    10 8721                 And     DiskStat,#$FF-Wr_Op
200A                8722                 
200A B0 E9        6 8723                 Clr     !r9     ;clear booleans
200C                8724                 
200C D6 03 40    20 8725 RdHBlk_Rpt:     Call    RdHdr_Resident     ;go internal to the Z8
200F                8726 
200F 18 E0        6 8727                 Ld      !r1,!r0         ;CASE Status.State
2011 56 E1 0F    10 8728                 And     !r1,#$0F
2014 A6 E1 02    10 8729                 Cp      !r1,#Norm_State
2017 6B 0D          8730                 Jr      Z,RdHdr_Norm
2019                8731                 
2019 D6 05 AE    20 8732                  Call   Reset_StMach
201C 56 56 BF    10 8733                  And    DiskStat,#$FF-RdHdrRecal
201F B8 EA        6 8734                  Ld     !rB,!rA
2021 A8 E0        6 8735                  Ld     !rA,!r0
2023 D6 05 1F    20 8736                 Call    Abort
2026                8737                 
2026 18 E0        6 8738 RdHdr_Norm:     Ld      !r1,!r0         ;IF ServorErr OR NOT( ServoRdy )
2028 76 E1 10    10 8739                 Tm      !r1,#ServoErr
202B EB 05          8740                 Jr      Nz,RdH_ServoErr
202D 76 E1 20    10 8741                 Tm      !r1,#ServoRdy
2030 EB 05          8742                 Jr      Nz,RdH_SrvoOk
2032                8743                 
2032 46 E9 C0    10 8744 RdH_ServoErr:   Or      !r9,#RdHError + RdHSrvoErr ; THEN RdHError AND RdHServoErrEnd
2035 8B 1A          8745                 Jr      RdH_End
2037                8746                 
2037 76 E0 80    10 8747 RdH_SrvoOk:     Tm      !r0,#CrcErrL    ;IF Status.CrcErr
203A 6B 0D          8748                 Jr      Z,RdH_CrcErr
203C 76 E0 40    10 8749 RdH_ChkEcc:     Tm      !r0,#WrtNvldL   ;OR Status.EccErr
203F EB 10          8750                 Jr      Nz,RdH_End
2041 46 E9 88    10 8751                 Or      !r9,#RdHError+RdCrcErr
2044 46 27 80    10 8752                 Or      RdErrCnt,#EccStat
2047 8B 08          8753                 Jr      RdH_End
2049                8754                 
2049 46 E9 88    10 8755 RdH_CrcErr:     Or      !r9,#RdHError+RdCrcErr    ; ELSE
204C E6 27 40    10 8756                 Ld      RdErrCnt,#CrcStat
204F 8B EB          8757                 Jr      RdH_ChkEcc
2051                8758                 
2051 08 E9        6 8759 RdH_End:        Ld      !r0,!r9 ;send status back to caller
2053 99 26        6 8760                 Ld      RdStat,!r9
2055                8761                 
2055 66 E0 80    10 8762                 Tcm     !r0,#RdHError ;set zero flag if error
2058 8D 04 F8       8763                 Jp      Bank_Ret
205B                8764                 
205B                8765                 .LSTOFF
205B                8770                 .LSTON









        WIDGET.ASSEM            Page 273
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


205B                8771                 .Page
205B                8772 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
205B                8773 ;>
205B                8774 ;>      Module: Utils.B1
205B                8775 ;>
205B                8776 ;>      BANK 1 MODULE
205B                8777 ;>
205B                8778 ;>      This module contains routines that are part of the main utility
205B                8779 ;>      module and that must be kept in Bank 1.
205B                8780 ;>
205B                8781 ;>      PROCEDURE RBuf_To_Buf2
205B                8782 ;>      PROCEDURE Buf2_To_RBuf
205B                8783 ;>      PROCEDURE WrBuf_To_Buf2
205B                8784 ;>      PROCEDURE Buf2_To_WrBuf
205B                8785 ;>      PROCEDURE RBuf_To_Spr
205B                8786 ;>      PROCEDURE Spr_To_RBuf
205B                8787 ;>      PROCEDURE WrBuf_To_Spr
205B                8788 ;>      PROCEDURE Spr_To_WrBuf
205B                8789 ;>      PROCEDURE Zero_RdBuf
205B                8790 ;>      PROCEDURE Zero_Fmt
205B                8791 ;>      FUNCTION Get_Cyl_H_S( PhysicalBlock : 3 BYTES { !!rC:E } ) :
205B                8792 ;>                          Cylinder : WORD { !!rC }
205B                8793 ;>                          Head : BYTE { !rE }
205B                8794 ;>                          Sector : BYTE { !rF }
205B                8795 ;>      FUNCTION GoodHdr : BOOLEAN
205B                8796 ;>                         Cylinder : WORD { !!r0 }
205B                8797 ;>                         Head : BYTE { !r2 }
205B                8798 ;>                         Sector : BYTE { !r3 }
205B                8799 ;>      PROCEDURE BlockMove( Destination : PTR { !!r2 }
205B                8800 ;>                           Source : PTR { !!r0 }
205B                8801 ;>                         )
205B                8802 ;>      FUNCTION UpDate_Hdr : BOOLEAN
205B                8803 ;>      FUNCTION Get_Type( DriverType : BYTE { !r8 } ) :
205B                8804 ;>                       BlockType : 3 BITS { !r8/bits 3:1 }
205B                8805 ;>                       BlockNumber : 3 BYTES { !rC:E }
205B                8806 ;>
205B                8807 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
205B                8808                 .LSTOFF
205B                8811                 .LSTON




















        WIDGET.ASSEM            Page 274
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


205B                8812                 .Page
205B                8813 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
205B                8814 ;>
205B                8815 ;>      Procedures: 
205B                8816 ;>                 Ld_Stand_Stat  { move standard status to output buffer }
205B                8817 ;>                 RBuf_To_Buf2   { move ReadBuffer to Buffer2 }
205B                8818 ;>                 Buf2_To_RBuf   { move Buffer2 to ReadBuffer }
205B                8819 ;>                 WrBuf_To_Buf2  { move WriteBuffer to Buffer2 }
205B                8820 ;>                 Buf2_To_WrBuf  { move Buffer2 to WriteBuffer }
205B                8821 ;>                 RBuf_To_Spr    { move ReadBuffer to SpareArray }
205B                8822 ;>                 Spr_To_RBuf    { move SpareArray to ReadBuffer }
205B                8823 ;>                 Zero_RdBuf     { move zeros to ReadBuffer }
205B                8824 ;>
205B                8825 ;>      Inputs: { none }
205B                8826 ;>
205B                8827 ;>      Outputs: { none }
205B                8828 ;>
205B                8829 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
205B                8830                 .LSTOFF
205B                8833                 .LSTON







































        WIDGET.ASSEM            Page 275
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


205B                8834                 .Page
205B                8835                 .FIN
205B                8836                 
205B 0C 12        6 8837 Buf2_To_RBuf:    Ld     !r0,#.HIBYTE. Buf2Array
205D 1C 74        6 8838                  Ld     !r1,#.LOWBYTE. Buf2Array
205F 2C 10        6 8839                  Ld     !r2,#.HIBYTE. RDummy
2061 3C 18        6 8840                  Ld     !r3,#.LOWBYTE. RDummy
2063 8B 37          8841                 Jr      B_Move
2065                8842 
2065 0C 10        6 8843 WrBuf_To_Buf2:   Ld     !r0,#.HIBYTE. ( WBuffer1-1 )
2067 1C 20        6 8844                  Ld     !r1,#.LOWBYTE. ( WBuffer1-1 )
2069 8B 2D          8845                 Jr      X_To_Buf2
206B                8846                 
206B 0C 12        6 8847 Buf2_To_WrBuf:   Ld     !r0,#.HIBYTE. Buf2Array
206D 1C 74        6 8848                  Ld     !r1,#.LOWBYTE. Buf2Array
206F 2C 10        6 8849                  Ld     !r2,#.HIBYTE. ( WBuffer1-1 )
2071 3C 20        6 8850                  Ld     !r3,#.LOWBYTE. ( WBuffer1-1 )
2073 8B 27          8851                 Jr      B_Move
2075                8852                 
2075 0C 14        6 8853 Spr_To_RBuf:     Ld     !r0,#.HIBYTE. SpareArray
2077 1C BB        6 8854                  Ld     !r1,#.LOWBYTE. SpareArray
2079 2C 10        6 8855                  Ld     !r2,#.HIBYTE. RBuffer1
207B 3C 19        6 8856                  Ld     !r3,#.LOWBYTE. RBuffer1
207D 8B 1D          8857                 Jr      B_Move
207F                8858 
207F 0C 10        6 8859 RBuf_To_Spr:     Ld     !r0,#.HIBYTE. RBuffer1
2081 1C 19        6 8860                  Ld     !r1,#.LOWBYTE. RBuffer1
2083 2C 14        6 8861 X_To_Spr:        Ld     !r2,#.HIBYTE. SpareArray
2085 3C BB        6 8862                  Ld     !r3,#.LOWBYTE. SpareArray
2087 8B 13          8863                 Jr      B_Move
2089                8864                 
2089 0C 10        6 8865 WrBuf_To_Spr:    Ld     !r0,#.HIBYTE. WBuffer1
208B 1C 21        6 8866                  Ld     !r1,#.LOWBYTE. WBuffer1
208D 8B F4          8867                  Jr     X_To_Spr
208F                8868                  
208F A6 58 02    10 8869 RBuf_To_Buf2:   Cp      DataType,#User_Type ;nop if sparetable data
2092 EB 0B          8870                 Jr      Nz,Return_Vector
2094 0C 10        6 8871                  Ld     !r0,#.HIBYTE. RDummy
2096 1C 18        6 8872                  Ld     !r1,#.LOWBYTE. RDummy
2098 2C 12        6 8873 X_To_Buf2:       Ld     !r2,#.HIBYTE. Buf2Array
209A 3C 74        6 8874                  Ld     !r3,#.LOWBYTE. Buf2Array
209C D6 21 55    20 8875 B_Move:         Call    BlockMove
209F 8D 04 F8       8876 Return_Vector:  Jp      Bank_Ret
20A2                8877                 
20A2 0C 14        6 8878 Spr_To_WrBuf:    Ld     !r0,#.HIBYTE. SpareArray
20A4 1C BB        6 8879                  Ld     !r1,#.LOWBYTE. SpareArray
20A6 2C 10        6 8880                  Ld     !r2,#.HIBYTE. WBuffer1
20A8 3C 21        6 8881                  Ld     !r3,#.LOWBYTE. WBuffer1
20AA 8B F0          8882                 Jr      B_Move
20AC                8883 
20AC 2C 10        6 8884 Zero_RdBuf:      Ld     !r2,#.HIBYTE. ReadArray
20AE 3C 00        6 8885                  Ld     !r3,#.LOWBYTE. ReadArray
20B0 D6 22 80    20 8886                 Call    ZeroBlock
20B3 8B EA          8887                 Jr      Return_Vector





        WIDGET.ASSEM            Page 276
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


20B5                8888 
20B5 2C 10        6 8889 Zero_Fmt:        Ld     !r2,#.HIBYTE. ReadArray
20B7 3C 00        6 8890                  Ld     !r3,#.LOWBYTE. ReadArray
20B9 EC 00        6 8891                  Ld     !rE,#.HIBYTE. ( FBuffer1 - ReadArray )
20BB 0C 00        6 8892                  Ld     !r0,#0 ;init block to pattern
20BD 92 02       12 8893 Zero_FLp:       Lde     @!!r2,!r0
20BF A0 E2       10 8894                 Incw    !!r2
20C1 00 EE        6 8895                 Dec     !rE
20C3 EB F8          8896                 Jr      Nz,Zero_Flp
20C5 2C 10        6 8897                  Ld     !r2,#.HIBYTE. FBuffer1
20C7 3C 52        6 8898                  Ld     !r3,#.LOWBYTE. FBuffer1
20C9 EC 02        6 8899                  Ld     !rE,#.HIBYTE. ( FEndGap - FBuffer1 )
20CB FC 1C        6 8900                  Ld     !rF,#.LOWBYTE. ( FEndGap - FBuffer1 )
20CD 0C C6        6 8901                  Ld     !r0,#$C6 ;init block to pattern
20CF 92 02       12 8902 Zero_FLp1:      Lde     @!!r2,!r0
20D1 A0 E2       10 8903                 Incw    !!r2
20D3 80 EE       10 8904                 Decw    !!rE
20D5 EB F8          8905                 Jr      Nz,Zero_Flp1
20D7 8D 20 9F*46    8906                 Jp      Return_Vector
20DA                8907                 
20DA                8908                 .LSTOFF
20DA                8910                 .LSTON





































        WIDGET.ASSEM            Page 277
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


20DA                8911                 .Page
20DA                8912 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
20DA                8913 ;>
20DA                8914 ;>      Function: Get_Cyl_H_S  { Get Cylinder, Head, and Sector }
20DA                8915 ;>
20DA                8916 ;>      This routine extracts the cylinder, head, and sector information
20DA                8917 ;>      from a physical block number.
20DA                8918 ;>
20DA                8919 ;>      Inputs:
20DA                8920 ;>              PhysicalBlockNumber : 3 BYTES { !rC:E }
20DA                8921 ;>
20DA                8922 ;>      Outputs:
20DA                8923 ;>              HiCylinder : BYTE { !rC }
20DA                8924 ;>              LoCylinder : BYTE { !rD }
20DA                8925 ;>              Head       : BYTE { !rE }
20DA                8926 ;>              Sector     : BYTE { !rF }
20DA                8927 ;>
20DA                8928 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
20DA                8929                 .LSTOFF
20DA                8932                 .LSTON







































        WIDGET.ASSEM            Page 278
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


20DA                8933                 .Page
20DA                8934                 .FIN
20DA                8935                 
20DA                8936 Get_Cyl_H_S:    
20DA D6 25 D5    20 8937                 Call    DivHdsSctrs     ;return Cylinder #, remainder = !r0:3
20DD                8938                 
20DD 70 E0          8939                 Push    !r0             ;get ready to pass results to caller
20DF 70 E1          8940                 Push    !r1
20E1                8941 
20E1 D6 25 E1    20 8942                 Call    DivSctrs        ;return with !r1 = Head, !r2 = Sector
20E4                8943                 
20E4 F8 E3        6 8944                 Ld      !rF,!r3         ;Sector
20E6 E8 E2        6 8945                 Ld      !rE,!r2         ;Head
20E8 50 ED       10 8946                 Pop     !rD             ;Lo Cylinder
20EA 50 EC       10 8947                 Pop     !rC             ;Hi Cylinder
20EC                8948                 
20EC F9 22        6 8949                 Ld      PSector,!rF     ;UpDate physical sector
20EE                8950                 
20EE 8D 04 F8       8951                 Jp      Bank_Ret
20F1                8952                 
20F1                8953                 .LSTOFF
20F1                8955                 .LSTON





































        WIDGET.ASSEM            Page 279
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


20F1                8956                 .Page
20F1                8957 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
20F1                8958 ;>
20F1                8959 ;>      Function: UpDate_Cur_Cyl
20F1                8960 ;>
20F1                8961 ;>      This function is responsible for reading the header off of
20F1                8962 ;>      an arbitrary sector. The cylinder information is extracted
20F1                8963 ;>      from the header and placed into the current cylinder memory
20F1                8964 ;>      locations.
20F1                8965 ;>
20F1                8966 ;>      Inputs: { none }
20F1                8967 ;>
20F1                8968 ;>      Outputs:
20F1                8969 ;>              UpDate_Cur_Cyl : BOOLEAN { Zero flag is set if NOT( ReadHdr ) }
20F1                8970 ;>
20F1                8971 ;>      Global Variables Changed:
20F1                8972 ;>              Cur_Cylinder
20F1                8973 ;>
20F1                8974 ;>      Algorithm:
20F1                8975 ;>
20F1                8976 ;>      BEGIN
20F1                8977 ;>       Temp := GoodHdr( ReadHdr )
20F1                8978 ;>       IF Temp
20F1                8979 ;>        THEN Cur_Cylinder := ReadHdr.Cylinder
20F1                8980 ;>       UpDate_Cur_Cyl := Temp
20F1                8981 ;>      END
20F1                8982 ;>
20F1                8983 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
20F1                8984                 .LSTOFF
20F1                8987                 .LSTON





























        WIDGET.ASSEM            Page 280
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


20F1                8988                 .Page
20F1                8989                 .FIN
20F1                8990                 
20F1                8991 UpDate_Cur_Cyl:
20F1 D6 21 00    20 8992                 Call    GoodHdr
20F4 6B 07          8993                 Jr      Z,UD_C_C_End
20F6                8994                 
20F6 09 50        6 8995                 Ld      Cur_Cyl,!r0
20F8 19 51        6 8996                 Ld      Cur_Cyl+1,!r1
20FA 46 E1 01    10 8997                 Or      !r1,#01         ;return non-zero status
20FD                8998                 
20FD 8D 04 F8       8999 UD_C_C_End:     Jp      Bank_Ret
2100                9000                  
2100                9001                 .LSTOFF
2100                9003                 .LSTON












































        WIDGET.ASSEM            Page 281
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2100                9004                 .Page
2100                9005 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2100                9006 ;>
2100                9007 ;>      Function: GoodHdr
2100                9008 ;>
2100                9009 ;>      This function is responsible for reading a header off of a 
2100                9010 ;>      sector and checking that header for validity, i.e., whether
2100                9011 ;>      the cylinder, head, and sector ( and their complements ) look
2100                9012 ;>      reasonable.
2100                9013 ;>
2100                9014 ;>      Inputs: { none }
2100                9015 ;>
2100                9016 ;>      Outputs:
2100                9017 ;>              GoodHdr : BOOLEAN { Zero flag is set if Header invalid }
2100                9018 ;>              GoodHdr.Cylinder : WORD { !!r0 }
2100                9019 ;>              GoodHdr.Head     : BYTE { !r2 }
2100                9020 ;>              GoodHdr.Sector   : BYTE { !r3 }
2100                9021 ;>
2100                9022 ;>      Algorithm:
2100                9023 ;>
2100                9024 ;>      BEGIN
2100                9025 ;>       ReadHdr
2100                9026 ;>       IF ( Inverse( ReadHdr.Cylinder ) = ReadHdr.InverseCylinder ) AND
2100                9027 ;>          ( Inverse( ReadHdr.HdSctr ) = ReadHdr.InverseHdSctr )
2100                9028 ;>        THEN
2100                9029 ;>              GoodHdr := True
2100                9030 ;>              GoodHdr.Cylinder := ReadHdr.Cylinder
2100                9031 ;>              GoodHdr.Head := ReadHdr.HdSctr/bits 7:6
2100                9032 ;>              GoodHdr.Sector := ReadHdr.HdSctr/bits 5:0
2100                9033 ;>        ELSE
2100                9034 ;>              GoodHdr := False
2100                9035 ;>      END
2100                9036 ;>
2100                9037 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2100                9038                 .LSTOFF
2100                9041                 .LSTON























        WIDGET.ASSEM            Page 282
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2100                9042                 .Page
2100                9043                 .FIN
2100                9044                 
2100                9045 GoodHdr:
2100 4C 08        6 9046                 Ld      !r4,#8 ;try hard to read a good header
2102                9047                 
2102 D6 20 07    20 9048 GdHdr_1:        Call   ReadHdr
2105                9049 
2105 2C 10        6 9050                 Ld     !r2,#.HIBYTE. RHHeader
2107 3C 0C        6 9051                 Ld     !r3,#.LOWBYTE. RHHeader
2109 0C 40        6 9052                 Ld     !r0,#ScrReg0
210B 1C 06        6 9053                 Ld     !r1,#6  ;load 6 bytes
210D                9054 
210D 83 02       18 9055 GdHdr_Lp:       Ldei   @!r0,@!!r2
210F 1A FC          9056                 Djnz   !r1,GdHdr_Lp
2111                9057                 
2111 31 40        6 9058                 Srp    #Wrk_Scr ;context switch
2113                9059                 
2113 B2 30        6 9060                 Xor    !r3,!r0 ;check for valid header
2115 B2 41        6 9061                 Xor    !r4,!r1
2117 B2 52        6 9062                 Xor    !r5,!r2
2119                9063                 
2119 52 34        6 9064                 And    !r3,!r4
211B 52 35        6 9065                 And    !r3,!r5
211D 60 E3        6 9066                 Com    !r3
211F                9067                 
211F 31 10        6 9068                 Srp     #Wrk_Sys ;context switch
2121 B0 46        6 9069                 Clr     ScrReg6 ;assume bad header
2123 6B 13          9070                 Jr      Z,GdHdr_2
2125                9071                 
2125 76 24 80    10 9072                 Tm      Excpt_Stat,#Recovery ;check for Recovery on
2128 6B 25          9073                 Jr      Z,GdHdr_End
212A                9074                 
212A D6 27 EF    20 9075                 Call    ChkOff_NoOff ;set auto_offset if not already on
212D                9076                 
212D 2C 00        6 9077                  Ld     !r2,#.HIBYTE. 10 ;wait 100 ms before retrying
212F 3C 0A        6 9078                  Ld     !r3,#.LOWBYTE. 10
2131 D6 01 CB    20 9079                 Call    MsWait
2134                9080                 
2134 4A CC          9081                 Djnz    !r4,GdHdr_1 ;retry if bad header
2136 8B 17          9082                 Jr      GdHdr_End
2138                9083                 
2138 08 40        6 9084 GdHdr_2:        Ld      !r0,ScrReg0 ;GoodHdr.Cylinder := ReadHdr.Cylinder
213A 18 41        6 9085                 Ld      !r1,ScrReg1
213C 28 42        6 9086                 Ld      !r2,ScrReg2 ;GoodHdr.Head := ReadHdr.HdSctr/bits 7:6
213E F0 E2        8 9087                 Swap    !r2
2140 E0 E2        6 9088                 Rr      !r2
2142 E0 E2        6 9089                 Rr      !r2
2144 56 E2 03    10 9090                 And     !r2,#$03    ;just leave head info in register
2147 38 42        6 9091                 Ld      !r3,ScrReg2 ;GoodHdr.Sector := ReadHdr.HdSctr/bits 5:0
2149 56 E3 3F    10 9092                 And     !r3,#$3F
214C E6 46 01    10 9093                 Ld      ScrReg6,#1
214F                9094                 
214F 44 46 46    10 9095 GdHdr_End:      Or      ScrReg6,ScrReg6 ;set zero flag





        WIDGET.ASSEM            Page 283
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2152 8D 04 F8       9096                 Jp      Bank_Ret
2155                9097                 
2155                9098                 .LSTOFF
2155                9100                 .LSTON























































        WIDGET.ASSEM            Page 284
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2155                9101                 .Page
2155                9102 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2155                9103 ;>
2155                9104 ;>      Procedure: BlockMove
2155                9105 ;>
2155                9106 ;>      This procedure performs the following:
2155                9107 ;>
2155                9108 ;>      ( Destination ) <-- ( Source )
2155                9109 ;>
2155                9110 ;>      Where destination and source are both the same size ( namely
2155                9111 ;>      exactly 532 bytes plus CRC and ECC ).
2155                9112 ;>
2155                9113 ;>      Inputs:
2155                9114 ;>              Destination : PTR { !!r2 }
2155                9115 ;>              Source      : PTR { !!r0 }
2155                9116 ;>
2155                9117 ;>      Outputs: { none }
2155                9118 ;>
2155                9119 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2155                9120                 .LSTOFF
2155                9123                 .LSTON






































        WIDGET.ASSEM            Page 285
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2155                9124                 .Page
2155                9125                 .FIN
2155                9126 
2155                9127 BlockMove:
2155 D6 22 1B    20 9128                 Call    Ext_Push
2158                9129                 
2158 4C 02        6 9130                 Ld      !r4,#.HIBYTE. BlockLength
215A 5C 1D        6 9131                 Ld      !r5,#.LOWBYTE. BlockLength
215C                9132                 
215C 82 60       12 9133 Blk_Move:       Lde     !r6,@!!r0
215E 92 62       12 9134                 Lde     @!!r2,!r6
2160 A0 E0       10 9135                 Incw    !!r0
2162 A0 E2       10 9136                 Incw    !!r2
2164 80 E4       10 9137                 Decw    !!r4
2166 EB F4          9138                 Jr      Nz,Blk_Move
2168                9139                 
2168 D6 22 3C    20 9140                 Call    Ext_Pop
216B AF          14 9141                 Ret
216C                9142                 
216C                9143                 .LSTOFF
216C                9145                 .LSTON






































        WIDGET.ASSEM            Page 286
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


216C                9146                 .Page
216C                9147 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
216C                9148 ;>
216C                9149 ;>      Function: UpDate_Hdr  { UpDate Header }
216C                9150 ;>
216C                9151 ;>      This function is responsible for comparing the header information
216C                9152 ;>      in the buffer ( it is assumed that a ReadHdr operation has just
216C                9153 ;>      been performed and that the header info is currently residing in
216C                9154 ;>      the ReadHdr buffer space ) to that of the global cylinder variable.
216C                9155 ;>      If the two do not match, then Cur_Cyl is updated to reflect the
216C                9156 ;>      ReadHdr operations findings and the function returns a False
216C                9157 ;>      value indicating that a seek is in order.
216C                9158 ;>
216C                9159 ;>      Inputs: { none }
216C                9160 ;>
216C                9161 ;>      Outputs:
216C                9162 ;>              UpDate_Hdr : BOOLEAN { zero flag is true if off-track }
216C                9163 ;>
216C                9164 ;>      Global Variables Used:
216C                9165 ;>              Cylinder
216C                9166 ;>
216C                9167 ;>      Global Variables Changed:
216C                9168 ;>              On_Track, Cur_Cyl
216C                9169 ;>
216C                9170 ;>      Algorithm:
216C                9171 ;>
216C                9172 ;>      BEGIN
216C                9173 ;>       DiskStatus.On_Track := False
216C                9174 ;>       IF GoodHdr
216C                9175 ;>        THEN
216C                9176 ;>         IF ( RHHeader.Cylinder <> Cylinder )
216C                9177 ;>          THEN
216C                9178 ;>              Cur_Cyl := RHHeader.Cylinder
216C                9179 ;>              On_Track := False
216C                9180 ;>              UpDate_Hdr := False
216C                9181 ;>          ELSE
216C                9182 ;>              UpDate_Hdr := True
216C                9183 ;>              DiskStatus.On_Track := True
216C                9184 ;>      END
216C                9185 ;>
216C                9186 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
216C                9187                 .LSTOFF
216C                9190                 .LSTON
















        WIDGET.ASSEM            Page 287
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


216C                9191                 .Page
216C                9192                 .FIN
216C                9193 
216C                9194 UpDate_Hdr:
216C D6 22 1B    20 9195                 Call    Ext_Push
216F                9196                 
216F 56 56 7F    10 9197                 And     DiskStatus,#$FF-On_Track
2172                9198                 
2172 D6 21 00    20 9199                 Call    GoodHdr
2175 6B 21          9200                 Jr      Z,UpDt_Recal
2177                9201 
2177 09 50        6 9202 UpDate_OnTrck:  Ld      Cur_Cyl,!r0     ;Cur_Cyl := RHHeader.Cylinder
2179 19 51        6 9203                 Ld      Cur_Cyl+1,!r1
217B                9204                 
217B B4 52 E0    10 9205                 Xor     !r0,Cylinder ;check for correct cylinder address
217E B4 53 E1    10 9206                 Xor     !r1,Cylinder+1
2181 42 01        6 9207                 Or      !r0,!r1
2183 0C 00        6 9208                 Ld      !r0,#0 ;assume failure
2185 EB 05          9209                 Jr      Nz,UpDate_Err
2187                9210                 
2187 46 56 80    10 9211                 Or      DiskStatus,#On_Track
218A 0C 01        6 9212                 Ld      !r0,#1
218C                9213 
218C 42 00        6 9214 UpDate_Err:     Or      !r0,!r0
218E 70 FC          9215 UpDate_H_End:   Push    Flags
2190 D6 22 3C    20 9216                 Call    Ext_Pop
2193 50 FC       10 9217                 Pop     Flags
2195 8D 04 F8       9218                 Jp      Bank_Ret
2198                9219                 
2198 0C 40        6 9220 UpDt_Recal:      Ld     !r0,#DataRecal
219A D6 28 A0    20 9221                 Call    Restore
219D 0C 00        6 9222                 Ld      !r0,#0
219F 8B EB          9223                 Jr      UpDate_Err
21A1                9224                 
21A1                9225                 .LSTOFF
21A1                9227                 .LSTON























        WIDGET.ASSEM            Page 288
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21A1                9228                 .Page
21A1                9229 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21A1                9230 ;>
21A1                9231 ;>      Function: Get_Type
21A1                9232 ;>
21A1                9233 ;>      This function is responsible for converting Profile-style
21A1                9234 ;>      requests for the spare table and i.d. blocks into Widget
21A1                9235 ;>      types and blocknumbers. Get_Type also performs a bounds check
21A1                9236 ;>      on the blocknumber.
21A1                9237 ;>
21A1                9238 ;>      Inputs:
21A1                9239 ;>              DriverType      : BYTE { !r8 }
21A1                9240 ;>
21A1                9241 ;>      Outputs:
21A1                9242 ;>              BlockType   : BYTE { !r8 }
21A1                9243 ;>              BlockNumber : 3 BYTES { !rC:E }
21A1                9244 ;>
21A1                9245 ;>      Algorithm:
21A1                9246 ;>
21A1                9247 ;>      BEGIN
21A1                9248 ;>       BlockNumber := LogicalBlock
21A1                9249 ;>       IF ( DriverType = Profile )
21A1                9250 ;>        THEN
21A1                9251 ;>              CASE LogicalBlockNumber OF
21A1                9252 ;>
21A1                9253 ;>               FFFFFF : BlockType := SpareTable
21A1                9254 ;>                        BlockNumber := 1
21A1                9255 ;>
21A1                9256 ;>               FFFFFE : BlockType := ID
21A1                9257 ;>                        BlockNumber := 1
21A1                9258 ;>
21A1                9259 ;>              OTHERWISE  Type := Data
21A1                9260 ;>
21A1                9261 ;>        ELSE Type := Data
21A1                9262 ;>
21A1                9263 ;>       IF ( BlockNumber > MaxLogicalBlockNumber )
21A1                9264 ;>        THEN Abort
21A1                9265 ;>      END
21A1                9266 ;>
21A1                9267 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21A1                9268                 .LSTOFF
21A1                9271                 .LSTON

















        WIDGET.ASSEM            Page 289
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21A1                9272                 .Page
21A1                9273                 .FIN
21A1                9274 
21A1                9275 Get_Type:
21A1 D6 06 0D    20 9276                 Call    Load_Logical
21A4                9277                 
21A4 08 E8        6 9278                 Ld      !r0,!r8
21A6 8C 02        6 9279                 Ld      !r8,#User_Type
21A8                9280                 
21A8 42 00        6 9281                 Or      !r0,!r0 ;IF ( Driver_Type  = Profile )
21AA EB 2C          9282                 Jr      Nz,Get_Type_Check
21AC                9283                 
21AC 0C FF        6 9284                  Ld     !r0,#$FF ;IF BlockNumber = $-2...
21AE 1C FF        6 9285                  Ld     !r1,#$FF
21B0 2C FE        6 9286                  Ld     !r2,#$FE
21B2 D6 03 A5    20 9287                 Call    Sub3 ;compare
21B5 42 01        6 9288                 Or      !r0,!r1
21B7 42 02        6 9289                 Or      !r0,!r2
21B9 EB 0A          9290                 Jr      Nz,G_T_ChkID
21BB                9291                 
21BB 8C 08        6 9292                 Ld      !r8,#SprTbl_Type
21BD                9293                 
21BD B0 EC        6 9294 G_T_ProCnvrt:   Clr     !rC
21BF B0 ED        6 9295                 Clr     !rD
21C1 EC 01        6 9296                 Ld      !rE,#1
21C3 8B 13          9297                 Jr      Get_Type_Check
21C5                9298                 
21C5 0C FF        6 9299 G_T_ChkID:       Ld     !r0,#$FF ;IF BlockNumber = #$-1...
21C7 1C FF        6 9300                  Ld     !r1,#$FF
21C9 2C FF        6 9301                  Ld     !r2,#$FF
21CB D6 03 A5    20 9302                 Call    Sub3 ;compare
21CE 42 01        6 9303                 Or      !r0,!r1
21D0 42 02        6 9304                 Or      !r0,!r2
21D2 EB 04          9305                 Jr      Nz,Get_Type_Check
21D4 8C 04        6 9306                 Ld      !r8,#ID_Type
21D6 8B E5          9307                 Jr      G_T_ProCnvrt
21D8                9308                 
21D8 0C 00        6 9309 Get_Type_Check:  Ld     !r0,#HiMaxLogical ;IF ( BlockNumber > MaxLogical )...
21DA 1C 4B        6 9310                  Ld     !r1,#MidMaxLogical
21DC 2C FF        6 9311                  Ld     !r2,#LoMaxLogical
21DE D6 03 A5    20 9312                 Call    Sub3 ;compare
21E1 FB 0A          9313                 Jr      Uge,Get_Type_End
21E3                9314                 
21E3 0C 02        6 9315                  Ld     !r0,#2 ;byte 2
21E5 1C 40        6 9316                  Ld     !r1,#Illegal_Block
21E7 D6 04 03    20 9317                 Call    SetStatus
21EA                9318                 
21EA D6 05 1F    20 9319                 Call    Abort
21ED                9320                 
21ED 8D 04 F8       9321 Get_Type_End:   Jp      Bank_Ret
21F0                9322 
21F0                9323                 .LSTOFF
21F0                9328                 .LSTON






        WIDGET.ASSEM            Page 290
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21F0                9329                 .Page
21F0                9330 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21F0                9331 ;>
21F0                9332 ;>      Module: Utils1  { utilities, continued }
21F0                9333 ;>
21F0                9334 ;>      PROCEDURE Move4C( Source : PTR { !!r2 }
21F0                9335 ;>                       Destination : PTR { !!rE }
21F0                9336 ;>                      )
21F0                9337 ;>      PROCEDURE Init_ExtStack
21F0                9338 ;>      PROCEDURE Ext_Push
21F0                9339 ;>      PROCEDURE Ext_Pop
21F0                9340 ;>      FUNCTION Load_TOS : PTR { !!r2 }
21F0                9341 ;>      PROCEDURE Store_TOS( Ptr : PTR { !!r2 }
21F0                9342 ;>      PROCEDURE ZeroBlock
21F0                9343 ;>
21F0                9344 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21F0                9345                 .LSTOFF
21F0                9348                 .LSTON









































        WIDGET.ASSEM            Page 291
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21F0                9349                 .Page
21F0                9350 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21F0                9351 ;>
21F0                9352 ;>      Procedure: Move4
21F0                9353 ;>
21F0                9354 ;>      This procedure is used to move 4 bytes from the souce to the
21F0                9355 ;>      destination.
21F0                9356 ;>
21F0                9357 ;>      Inputs:
21F0                9358 ;>              Source : PTR { !!r2 }
21F0                9359 ;>              Destination : PTR { !!rE }
21F0                9360 ;>
21F0                9361 ;>      Outputs: { none }
21F0                9362 ;>
21F0                9363 ;>      Algorithm:
21F0                9364 ;>
21F0                9365 ;>      BEGIN
21F0                9366 ;>       FOR i := 0 TO 3 DO
21F0                9367 ;>        @Destination( i ) := @Source( i )
21F0                9368 ;>      END
21F0                9369 ;>
21F0                9370 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21F0                9371                 .LSTOFF
21F0                9374                 .LSTON



































        WIDGET.ASSEM            Page 292
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21F0                9375                 .Page
21F0                9376                 .FIN
21F0                9377 
21F0                9378 Move4:
21F0 1C 04        6 9379                 Ld      !r1,#4
21F2 82 02       12 9380 Move4_Lp:       Lde     !r0,@!!r2
21F4 92 0E       12 9381                 Lde     @!!rE,!r0
21F6 A0 E2       10 9382                 Incw    !!r2
21F8 A0 EE       10 9383                 Incw    !!rE
21FA 1A F6          9384                 Djnz    !r1,Move4_Lp
21FC                9385                 
21FC AF          14 9386                 Ret
21FD                9387                 
21FD                9388                 .LSTOFF
21FD                9390                 .LSTON












































        WIDGET.ASSEM            Page 293
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21FD                9391                 .Page
21FD                9392 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21FD                9393 ;>
21FD                9394 ;>      Procedure: Move4C { move from program space to data space }
21FD                9395 ;>
21FD                9396 ;>      This procedure is used to move 4 bytes from the souce to the
21FD                9397 ;>      destination.
21FD                9398 ;>
21FD                9399 ;>      Inputs:
21FD                9400 ;>              Source : PTR { !!r2 }
21FD                9401 ;>              Destination : PTR { !!rE }
21FD                9402 ;>
21FD                9403 ;>      Outputs: { none }
21FD                9404 ;>
21FD                9405 ;>      Algorithm:
21FD                9406 ;>
21FD                9407 ;>      BEGIN
21FD                9408 ;>       FOR i := 0 TO 3 DO
21FD                9409 ;>        @Destination( i ) := @Source( i )
21FD                9410 ;>      END
21FD                9411 ;>
21FD                9412 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
21FD                9413                 .LSTOFF
21FD                9416                 .LSTON



































        WIDGET.ASSEM            Page 294
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


21FD                9417                 .Page
21FD                9418                 .FIN
21FD                9419 
21FD                9420 Move4C:
21FD 1C 04        6 9421                 Ld      !r1,#4
21FF C2 02       12 9422 Move4C_Lp:      Ldc     !r0,@!!r2
2201 92 0E       12 9423                 Lde     @!!rE,!r0
2203 A0 E2       10 9424                 Incw    !!r2
2205 A0 EE       10 9425                 Incw    !!rE
2207 1A F6          9426                 Djnz    !r1,Move4C_Lp
2209                9427                 
2209 AF          14 9428                 Ret
220A                9429                 
220A                9430                 .LSTOFF
220A                9432                 .LSTON












































        WIDGET.ASSEM            Page 295
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


220A                9433                 .Page
220A                9434 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
220A                9435 ;>
220A                9436 ;>      Procedure: Init_ExtStack
220A                9437 ;>
220A                9438 ;>      This procedure initializes Widget's external stack. This
220A                9439 ;>      stack is a software implemented structure, and as such does not
220A                9440 ;>      use the Z8's external stack capabilities.
220A                9441 ;>
220A                9442 ;>      Inputs: { none }
220A                9443 ;>
220A                9444 ;>      Outputs: { none }
220A                9445 ;>
220A                9446 ;>      Global Variables Changed:
220A                9447 ;>              StackPtr
220A                9448 ;>
220A                9449 ;>      Algorithm:
220A                9450 ;>
220A                9451 ;>      BEGIN
220A                9452 ;>       StackPtr := TopOfStack
220A                9453 ;>      END
220A                9454 ;>
220A                9455 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
220A                9456                 .LSTOFF
220A                9459                 .LSTON


































        WIDGET.ASSEM            Page 296
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


220A                9460                 .Page
220A                9461                 .FIN
220A                9462 
220A                9463 Init_ExtStack:
220A 2C 17        6 9464                 Ld      !r2,#.HIBYTE. StackPtr
220C 3C 4C        6 9465                 Ld      !r3,#.LOWBYTE. StackPtr
220E 0C 17        6 9466                 Ld      !r0,#.HIBYTE. TopOfStack
2210 92 02       12 9467                 Lde     @!!r2,!r0
2212 A0 E2       10 9468                 Incw    !!r2
2214 0C FF        6 9469                 Ld      !r0,#.LOWBYTE. TopOfStack
2216 92 02       12 9470                 Lde     @!!r2,!r0
2218 8D 04 F8       9471                 Jp      Bank_Ret
221B                9472                 
221B                9473                 .LSTOFF
221B                9475                 .LSTON












































        WIDGET.ASSEM            Page 297
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


221B                9476                 .Page
221B                9477 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
221B                9478 ;>
221B                9479 ;>      Procedure: Ext_Push
221B                9480 ;>
221B                9481 ;>      This procedure pushes the current working register set
221B                9482 ;>      onto the external stack.
221B                9483 ;>
221B                9484 ;>      Inputs: { none }
221B                9485 ;>
221B                9486 ;>      Outputs: { none }
221B                9487 ;>
221B                9488 ;>      Algorithm:
221B                9489 ;>
221B                9490 ;>      BEGIN
221B                9491 ;>       FOR i := 0 TO 15 DO
221B                9492 ;>        @StackPtr := WorkingRegister[ 15 - i ]
221B                9493 ;>        StackPtr := StackPtr - 1
221B                9494 ;>      END
221B                9495 ;>
221B                9496 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
221B                9497                 .LSTOFF
221B                9500                 .LSTON




































        WIDGET.ASSEM            Page 298
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


221B                9501                 .Page
221B                9502                 .FIN
221B                9503 
221B                9504 Ext_Push:
221B E4 FD 44    10 9505                 Ld      ScrReg4,Rp ;save context
221E 31 40        6 9506                 Srp     #Wrk_Scr
2220                9507                 
2220 D6 22 58    20 9508                 Call    Load_TOS
2223                9509                 
2223 08 E4        6 9510                 Ld      !r0,!r4 ; save context
2225 06 E0 0F    10 9511                 Add     !r0,#$0F ; start at register $F
2228                9512                 
2228 1C 10        6 9513                 Ld      !r1,#16 ;load 16 registers
222A E3 F0        6 9514 Ext_Push_Lp:    Ld      !rF,@!r0
222C 92 F2       12 9515                 Lde     @!!r2,!rF
222E 00 E0        6 9516                 Dec     !r0
2230 80 E2       10 9517                 Decw    !!r2
2232 1A F6          9518                 Djnz    !r1,Ext_Push_Lp
2234                9519                 
2234 D6 22 63    20 9520                 Call    Store_TOS
2237                9521                 
2237 49 FD        6 9522                 Ld      Rp,!r4 ;restore context
2239 8D 04 F8       9523                 Jp      Bank_Ret
223C                9524                 
223C                9525                 .LSTOFF
223C                9527                 .LSTON

































        WIDGET.ASSEM            Page 299
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


223C                9528                 .Page
223C                9529 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
223C                9530 ;>
223C                9531 ;>      Procedure: Ext_Pop
223C                9532 ;>
223C                9533 ;>      This procedure pops 16 locations from the external stack 
223C                9534 ;>      into the current working register set.
223C                9535 ;>
223C                9536 ;>      Inputs: { none }
223C                9537 ;>
223C                9538 ;>      Outputs: { none }
223C                9539 ;>
223C                9540 ;>      Algorithm:
223C                9541 ;>
223C                9542 ;>      BEGIN
223C                9543 ;>       FOR i := 0 TO 15 DO
223C                9544 ;>        StackPtr := StackPtr + 1
223C                9545 ;>        WorkingRegisterSet[ i ] := @StackPtr
223C                9546 ;>      END
223C                9547 ;>
223C                9548 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
223C                9549                 .LSTOFF
223C                9552                 .LSTON




































        WIDGET.ASSEM            Page 300
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


223C                9553                 .Page
223C                9554                 .FIN
223C                9555 
223C                9556 Ext_Pop:
223C E4 FD 44    10 9557                 Ld      ScrReg4,Rp ;save context
223F 31 40        6 9558                 Srp     #Wrk_Scr
2241                9559                 
2241 D6 22 58    20 9560                 Call    Load_TOS
2244                9561                 
2244 08 E4        6 9562                 Ld      !r0,!r4 ; save context
2246                9563                 
2246 1C 10        6 9564                 Ld      !r1,#16 ;load 16 registers
2248                9565                 
2248 A0 E2       10 9566                 Incw    !!r2 ; StackPtr := StackPtr + 1
224A                9567                 
224A 83 02       18 9568 Ext_Pop_Lp:     Ldei    @!r0,@!!r2
224C 1A FC          9569                 Djnz    !r1,Ext_Pop_LP
224E                9570                 
224E 80 E2       10 9571                 Decw    !!r2 ;point at TOS
2250                9572                 
2250 D6 22 63    20 9573                 Call    Store_TOS
2253                9574                 
2253 49 FD        6 9575                 Ld      Rp,!r4 ;restore context
2255 8D 04 F8       9576                 Jp      Bank_Ret
2258                9577                 
2258                9578                 .LSTOFF
2258                9580                 .LSTON
































        WIDGET.ASSEM            Page 301
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2258                9581                 .Page
2258                9582 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2258                9583 ;>
2258                9584 ;>      Function: Load_TOS
2258                9585 ;>
2258                9586 ;>      This functions returns a ptr to the current top
2258                9587 ;>      of the external stack.
2258                9588 ;>
2258                9589 ;>      Inputs: { None }
2258                9590 ;>
2258                9591 ;>      Outputs:
2258                9592 ;>              Load_TOS : PTR { !!r2 }
2258                9593 ;>
2258                9594 ;>      Algorithm:
2258                9595 ;>
2258                9596 ;>      BEGIN
2258                9597 ;>       Load_TOS := StackPtr
2258                9598 ;>      END
2258                9599 ;>
2258                9600 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2258                9601                 .LSTOFF
2258                9604                 .LSTON





































        WIDGET.ASSEM            Page 302
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2258                9605                 .Page
2258                9606                 .FIN
2258                9607 
2258                9608 Load_TOS:
2258 0C 17        6 9609                 Ld      !r0,#.HIBYTE. StackPtr
225A 1C 4C        6 9610                 Ld      !r1,#.LOWBYTE. StackPtr
225C 82 20       12 9611                 Lde     !r2,@!!r0
225E A0 E0       10 9612                 Incw    !!r0
2260 82 30       12 9613                 Lde     !r3,@!!r0
2262 AF          14 9614                 Ret
2263                9615                 
2263                9616                 .LSTOFF
2263                9618                 .LSTON














































        WIDGET.ASSEM            Page 303
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2263                9619                 .Page
2263                9620 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2263                9621 ;>
2263                9622 ;>      Procedure: Store_TOS
2263                9623 ;>
2263                9624 ;>      This procedure stores the contents of Ptr into StackPtr
2263                9625 ;>
2263                9626 ;>      Inputs:
2263                9627 ;>              Ptr : PTR { !!r2 }
2263                9628 ;>
2263                9629 ;>      Outputs: { none }
2263                9630 ;>
2263                9631 ;>      Algorithm:
2263                9632 ;>
2263                9633 ;>      BEGIN
2263                9634 ;>       StackPtr := Ptr
2263                9635 ;>      END
2263                9636 ;>
2263                9637 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2263                9638                 .LSTOFF
2263                9641                 .LSTON






































        WIDGET.ASSEM            Page 304
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2263                9642                 .Page
2263                9643                 .FIN
2263                9644 
2263                9645 Store_TOS:
2263 A6 E3 4C    10 9646                 Cp      !r3,#.LOWBYTE. StackPtr ;check for stack underflow
2266 BB 0D          9647                 Jr      Ugt,St_TOS
2268                9648                 
2268 31 10        6 9649                 Srp     #Wrk_Sys
226A 50 E4       10 9650                 Pop     !r4 ;save some history of stack frame
226C 50 E5       10 9651                 Pop     !r5
226E 50 E6       10 9652                 Pop     !r6
2270 50 E7       10 9653                 Pop     !r7
2272 D6 05 1F    20 9654                 Call    Abort
2275                9655                 
2275 0C 17        6 9656 St_TOS:         Ld      !r0,#.HIBYTE. StackPtr
2277 1C 4C        6 9657                 Ld      !r1,#.LOWBYTE. StackPtr
2279 92 20       12 9658                 Lde     @!!r0,!r2
227B A0 E0       10 9659                 Incw    !!r0
227D 92 30       12 9660                 Lde     @!!r0,!r3
227F AF          14 9661                 Ret
2280                9662                 
2280                9663                 .LSTOFF
2280                9665                 .LSTON




































        WIDGET.ASSEM            Page 305
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2280                9666                 .Page
2280                9667 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2280                9668 ;>
2280                9669 ;>      Procedure: ZeroBlock
2280                9670 ;>
2280                9671 ;>      This procedure zeros out the 532 blocks pointed to by the
2280                9672 ;>      input parameter
2280                9673 ;>
2280                9674 ;>      Inputs:
2280                9675 ;>              BlockPtr : PTR { !!r2 }
2280                9676 ;>
2280                9677 ;>      Outputs: { none }
2280                9678 ;>
2280                9679 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2280                9680                 .LSTOFF
2280                9683                 .LSTON











































        WIDGET.ASSEM            Page 306
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2280                9684                 .Page
2280                9685                 .FIN
2280                9686 
2280                9687 ZeroBlock:
2280 EC 02        6 9688                 Ld      !rE,#.HIBYTE. 532
2282 FC 14        6 9689                 Ld      !rF,#.LOWBYTE. 532
2284                9690                 
2284 B0 E0        6 9691                 Clr     !r0
2286                9692                 
2286 92 02       12 9693 ZeroBlk_Lp:     Lde     @!!r2,!r0
2288 A0 E2       10 9694                 Incw    !!r2
228A 80 EE       10 9695                 Decw    !!rE
228C EB F8          9696                 Jr      Nz,ZeroBlk_Lp
228E                9697                 
228E 8D 04 F8       9698                 Jp      Bank_Ret
2291                9699                 
2291                9700                 .LSTOFF
2291                9702                 .LSTON









































        WIDGET.ASSEM            Page 307
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2291                9703                 .Page
2291                9704 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2291                9705 ;>
2291                9706 ;>      Procedure: ZeroHeader
2291                9707 ;>
2291                9708 ;>      This procedure zeros the sector gap, header sync gap,
2291                9709 ;>      header field, and data sync field.
2291                9710 ;>
2291                9711 ;>      Inputs: { none }
2291                9712 ;>
2291                9713 ;>      Outputs: { none }
2291                9714 ;>
2291                9715 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2291                9716                 .LSTOFF
2291                9719                 .LSTON












































        WIDGET.ASSEM            Page 308
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2291                9720                 .Page
2291                9721                 .FIN
2291                9722 
2291                9723 ZeroHeader:
2291 1C 21        6 9724                 Ld      !r1,#( WBuffer1 - WriteArray )
2293 2C 10        6 9725                 Ld      !r2,#.HIBYTE. WriteArray
2295 3C 00        6 9726                 Ld      !r3,#.LOWBYTE. WriteArray
2297 B0 E0        6 9727                 Clr     !r0
2299                9728                 
2299 92 02       12 9729 ZeroHdr_Lp:     Lde     @!!r2,!r0
229B A0 E2       10 9730                 Incw    !!r2
229D 1A FA          9731                 Djnz    !r1,ZeroHdr_Lp
229F                9732                 
229F 56 24 D7    10 9733                 And     Excpt_Stat,#$FF-Nzero_Stat-Buf_Damage
22A2 8D 04 F8       9734                 Jp      Bank_Ret
22A5                9735                 
22A5                9736                 .LSTOFF
22A5                9741                 .LSTON









































        WIDGET.ASSEM            Page 309
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


22A5                9742                 .Page
22A5                9743 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
22A5                9744 ;>
22A5                9745 ;>      Module: Spr1.B1
22A5                9746 ;>
22A5                9747 ;>      This module contains those sparing routines that must
22A5                9748 ;>      be located in bank1.
22A5                9749 ;>
22A5                9750 ;>      PROCEDURE Init_SprTbl
22A5                9751 ;>      PROCEDURE Load_SprTbl
22A5                9752 ;>      PROCEDURE SprChkSum
22A5                9753 ;>      FUNCTION Chk_SprChk
22A5                9754 ;>      FUNCTION Spr( SpareTableIndex : BYTE { !r8 } ) : 3 BYTES { !rC:E }
22A5                9755 ;>      PROCEDURE UpDate_SprTbl
22A5                9756 ;>      FUNCTION Chk_PassWord : BOOLEAN
22A5                9757 ;>      PROCEDURE Load_PassWord( Destination : PTR { !!rE } )
22A5                9758 ;>      PROCEDURE SpareCount( 2 BITS { !r0/Bits 1:0 } )
22A5                9759 ;>
22A5                9760 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
22A5                9761                 .LSTOFF
22A5                9764                 .LSTON






































        WIDGET.ASSEM            Page 310
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


22A5                9765                 .Page
22A5                9766 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
22A5                9767 ;>
22A5                9768 ;>      Procedure: Init_SprTbl
22A5                9769 ;>
22A5                9770 ;>      BANK 1 PROCEDURE
22A5                9771 ;>
22A5                9772 ;>      This procedure initializes the spare table. It assumes
22A5                9773 ;>      that there is NO spare table on disk.
22A5                9774 ;>
22A5                9775 ;>      Inputs:
22A5                9776 ;>              FormatOffset : BYTE { !r4 }
22A5                9777 ;>              FormatInterLeave : BYTE { !r5 }
22A5                9778 ;>
22A5                9779 ;>      Outputs: { none }
22A5                9780 ;>
22A5                9781 ;>      Algorithm:
22A5                9782 ;>
22A5                9783 ;>      BEGIN
22A5                9784 ;>       SparePw1 := $F0783C1E
22A5                9785 ;>       SpareTmStmp := 0
22A5                9786 ;>       FOR i := 0 TO Length( SegPtrArray ) - 1 DO
22A5                9787 ;>        SegPtrArray[ i ].Nil := True
22A5                9788 ;>        SegPtrArray[ i ].Ptr := 0
22A5                9789 ;>       SpareCount := 0
22A5                9790 ;>       BadCount := 0
22A5                9791 ;>       FOR i := 0 TO Length( SpareBitMap ) - 1 DO
22A5                9792 ;>        SpareBitMap[ i ] := 0
22A5                9793 ;>       FOR i := 0 TO 1 DO
22A5                9794 ;>        AddSpare( SprTbl_Type, Spare, GetNewSpare( Spr( i ) ), Spr( i ) )
22A5                9795 ;>       SparePw2 := $F0783C1E
22A5                9796 ;>       UpDate_SprTbl
22A5                9797 ;>      END
22A5                9798 ;>
22A5                9799 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
22A5                9800                 .LSTOFF
22A5                9803                 .LSTON






















        WIDGET.ASSEM            Page 311
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


22A5                9804                 .Page
22A5                9805                 .FIN
22A5                9806 
22A5                9807 Init_SprTbl:
22A5 2C 14        6 9808                  Ld     !r2,#.HIBYTE. SpareArray
22A7 3C BB        6 9809                  Ld     !r3,#.LOWBYTE. SpareArray
22A9 D6 22 80    20 9810                 Call    ZeroBlock
22AC                9811                 
22AC EC 14        6 9812                 Ld      !rE,#.HIBYTE. SparePw1
22AE FC BB        6 9813                 Ld      !rF,#.LOWBYTE. SparePw1
22B0 D6 25 07    20 9814                 Call    Load_PassWord ;load SparePw1
22B3                9815                 
22B3 2C 14        6 9816                 Ld      !r2,#.HIBYTE. FmtOffset
22B5 3C C3        6 9817                 Ld      !r3,#.LOWBYTE. FmtOffset
22B7                9818                 
22B7 92 42       12 9819                 Lde     @!!r2,!r4 ;store offset value
22B9 A0 E2       10 9820                 Incw    !!r2
22BB 92 52       12 9821                 Lde     @!!r2,!r5 ;store interleave value
22BD A0 E2       10 9822                 Incw    !!r2
22BF                9823                 
22BF 0C 80        6 9824                 Ld      !r0,#Nil
22C1 1C 80        6 9825                 Ld      !r1,#( SprCount - SegPtrArray )
22C3 92 02       12 9826 I_S_Tbl_Lp2:    Lde     @!!r2,!r0
22C5 A0 E2       10 9827                 Incw    !!r2
22C7 1A FA          9828                 Djnz    !r1,I_S_Tbl_Lp2
22C9                9829                 
22C9 0C 00        6 9830                 Ld      !r0,#$00
22CB 4C 01        6 9831                 Ld      !r4,#.HIBYTE. ( SpareCheck - SprCount )
22CD 5C 4F        6 9832                 Ld      !r5,#.LOWBYTE. ( SpareCheck - SprCount )
22CF 92 02       12 9833 I_S_Tbl_Lp4:    Lde     @!!r2,!r0
22D1 A0 E2       10 9834                 Incw    !!r2
22D3 80 E4       10 9835                 Decw    !!r4
22D5 EB F8          9836                 Jr      Nz,I_S_Tbl_Lp4
22D7                9837                 
22D7 E6 58 08    10 9838                 Ld      Data_Type,#SprTbl_Type
22DA 5C 02        6 9839                 Ld      !r5,#2 ;create two tables
22DC B0 E8        6 9840                 Clr     !r8
22DE D6 24 3B    20 9841 Create_Tbl:     Call    Spr
22E1 2C 15        6 9842                  Ld     !r2,#.HIBYTE. GetNewSpare
22E3 3C 07        6 9843                  Ld     !r3,#.LOWBYTE. GetNewSpare
22E5 D6 04 AB    20 9844                 Call    Bank_Call
22E8 70 E8          9845                 Push    !r8 ;save counter
22EA F8 E0        6 9846                  Ld     !rF,!r0
22EC 8C 08        6 9847                  Ld     !r8,#SprTbl_Type
22EE 46 E8 10    10 9848                  Or     !r8,#Spare
22F1 2C 15        6 9849                  Ld     !r2,#.HIBYTE. AddSpare
22F3 3C 74        6 9850                  Ld     !r3,#.LOWBYTE. AddSpare
22F5 D6 04 AB    20 9851                 Call    Bank_Call
22F8 50 E8       10 9852                 Pop     !r8
22FA 8E           6 9853                 Inc     !r8 ;go to next table
22FB 5A E1          9854                 Djnz    !r5,Create_Tbl
22FD                9855                 
22FD 2C 16        6 9856                 Ld      !r2,#.HIBYTE. Map_Table
22FF 3C 81        6 9857                 Ld      !r3,#.LOWBYTE. Map_Table





        WIDGET.ASSEM            Page 312
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2301 1C 13        6 9858                 Ld      !r1,#NbrSctrs
2303 0C 00        6 9859                 Ld      !r0,#0
2305 92 02       12 9860 I_Map_Lp:       Lde     @!!r2,!r0
2307 A0 E2       10 9861                 Incw    !!r2
2309 06 E0 0C    10 9862                 Add     !r0,#Map_Dflt
230C A6 E0 13    10 9863                 Cp      !r0,#NbrSctrs
230F 1B 03          9864                 Jr      Lt,I_Map_Lp2
2311 26 E0 13    10 9865                 Sub     !r0,#NbrSctrs
2314 1A EF          9866 I_Map_Lp2:      Djnz    !r1,I_Map_Lp
2316                9867                 
2316 EC 16        6 9868                 Ld      !rE,#.HIBYTE. SparePw2
2318 FC 96        6 9869                 Ld      !rF,#.LOWBYTE. SparePw2
231A D6 25 07    20 9870                 Call    Load_PassWord
231D                9871                 
231D D6 24 51    20 9872                 Call    UpDate_SprTbl
2320 8D 04 F8       9873                 Jp      Bank_Ret
2323                9874 
2323                9875                 .LSTOFF
2323                9877                 .LSTON








































        WIDGET.ASSEM            Page 313
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2323                9878                 .Page
2323                9879 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2323                9880 ;>
2323                9881 ;>      Procedure: Load_SprTbl
2323                9882 ;>
2323                9883 ;>      BANK 1 PROCEDURE
2323                9884 ;>
2323                9885 ;>      This procedure loads the spare table from disk. The table is 
2323                9886 ;>      found by a linear search of all the spare blocks until a block
2323                9887 ;>      is found where both the Spare Table Identifier field is present
2323                9888 ;>      and the internal passwords and check byte are valid.
2323                9889 ;>
2323                9890 ;>      Inputs: { none }
2323                9891 ;>
2323                9892 ;>      Outputs: { none }
2323                9893 ;>
2323                9894 ;>      Algorithm:
2323                9895 ;>
2323                9896 ;>      BEGIN
2323                9897 ;>       Seek_Type := Access_Offset
2323                9898 ;>       InterLeaveFactor := Find_InterLeave
2323                9899 ;>       Found := False
2323                9900 ;>       Count := 0
2323                9901 ;>       i := NumberOfSpareBlocks
2323                9902 ;>       WHILE ( i > 0 ) AND ( Count < 2 ) DO
2323                9903 ;>              Seek( CnvrtLogical( MulR0_m( i ) ) )
2323                9904 ;>              J := 0
2323                9905 ;>              Sector := 0
2323                9906 ;>              WHILE NOT( Found ) AND ( j < NbrSctrs ) DO
2323                9907 ;>                IF ReadCommon
2323                9908 ;>                 THEN
2323                9909 ;>                  IF ( BlockID = SprTblID ) AND 
2323                9910 ;>                     ( PassWord1 = PassWord2 = PassWord ) AND
2323                9911 ;>                     ( CheckByte is valid )
2323                9912 ;>                   THEN
2323                9913 ;>                        Found := True
2323                9914 ;>                        Count := Count + 1
2323                9915 ;>                        IF ( Count >   1 )
2323                9916 ;>                         THEN
2323                9917 ;>                          IF ( SpareTable.RunNumber < ReadBuffer.RunNumber )
2323                9918 ;>                           THEN MoveBlock( SpareTable, ReadBuffer )
2323                9919 ;>                         ELSE MoveBlock( SpareTable, ReadBuffer )
2323                9920 ;>                 ELSE
2323                9921 ;>                  IF ( RdErrCnt < 10 )
2323                9922 ;>                   THEN
2323                9923 ;>                    MoveBlock( ReadBuffer, Buffer2 )
2323                9924 ;>                    IF ( BlockID = SprTblID ) AND 
2323                9925 ;>                       ( PassWord1 = PassWord2 = PassWord ) AND
2323                9926 ;>                       ( CheckByte is valid )
2323                9927 ;>                     THEN
2323                9928 ;>                          Found := True
2323                9929 ;>                          Count := Count + 1
2323                9930 ;>                          IF ( Count >     1 )
2323                9931 ;>                           THEN





        WIDGET.ASSEM            Page 314
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2323                9932 ;>                            IF ( SpareTable.RunNumber < ReadBuffer.RunNumber )
2323                9933 ;>                             THEN MoveBlock( SpareTable, ReadBuffer )
2323                9934 ;>                           ELSE MoveBlock( SpareTable, ReadBuffer )
2323                9935 ;>                 j := j + 1
2323                9936 ;>                 Sector := ( Sector + InterLeaveFactor ) MOD NbrSctrs
2323                9937 ;>               i := i - 1
2323                9938 ;>        IF NOT( Found )
2323                9939 ;>         THEN Abort
2323                9940 ;>         ELSE
2323                9941 ;>              UpDate_SprTbl
2323                9942 ;>              Park
2323                9943 ;>              SlfTst_Result.NoSpareTable := False
2323                9944 ;>
2323                9945 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2323                9946                 .LSTOFF
2323                9949                 .LSTON











































        WIDGET.ASSEM            Page 315
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2323                9950                 .Page
2323                9951                 .FIN
2323                9952 
2323                9953 Load_SprTbl:
2323 5C 4C        6 9954                 Ld      !r5,#76 ;i := NumberOfSpareBlocks
2325 B0 E4        6 9955                 Clr     !r4     ;SprTbl_Found := False
2327 E6 58 02    10 9956                 Ld      DataType,#User_Type
232A                9957                 
232A D6 22 1B    20 9958 L_SprTbl_Lp:    Call    Ext_Push
232D 08 E5        6 9959                  Ld      !r0,!r5
232F 2C 25        6 9960                  Ld     !r2,#.HIBYTE. MulR0_m
2331 3C CC        6 9961                  Ld     !r3,#.LOWBYTE. MulR0_m
2333 D6 04 AB    20 9962                 Call    Bank_Call
2336 2C 20        6 9963                  Ld     !r2,#.HIBYTE. Get_Cyl_H_S
2338 3C DA        6 9964                  Ld     !r3,#.LOWBYTE. Get_Cyl_H_S
233A D6 04 AB    20 9965                 Call    Bank_Call
233D E6 57 80    10 9966                 Ld      Seek_Type,#Access
2340 D6 05 D7    20 9967                 Call    New_Seek
2343 D6 22 3C    20 9968                 Call    Ext_Pop
2346                9969                 
2346 6C 13        6 9970                 Ld      !r6,#NbrSctrs ;check the entire track
2348 B0 55        6 9971                 Clr     Sector ;starting with sector 0
234A                9972                 
234A 70 E4          9973 L_Rd_Lp:        Push    !r4
234C 70 E5          9974                 Push    !r5
234E 70 E6          9975                 Push    !r6
2350 2C 10        6 9976                  Ld     !r2,#.HIBYTE. RdBlk_Vector
2352 3C 83        6 9977                  Ld     !r3,#.LOWBYTE. RdBlk_Vector
2354 D6 04 AB    20 9978                 Call    Bank_Call
2357 50 E6       10 9979                 Pop     !r6
2359 50 E5       10 9980                 Pop     !r5
235B 50 E4       10 9981                 Pop     !r4
235D EB 1C          9982                 Jr      Nz,Chk_SprTbl
235F                9983                 
235F 08 27        6 9984                 Ld      !r0,RdErrCnt
2361 56 E0 0F    10 9985                 And     !r0,#$0F ;mask unwanted status
2364 A6 E0 0A    10 9986                 Cp      !r0,#10 ;check for any successful reads
2367 9B 05          9987                 Jr      Ge,L_SprTbl_More
2369                9988                 
2369 D6 20 5B    20 9989                 Call    Buf2_To_RBuf ;get good data back into ReadBuffer
236C 8B 0D          9990                 Jr      Chk_SprTbl
236E                9991                  
236E 20 55        6 9992 L_SprTbl_More:  Inc     Sector
2370 6A D8          9993                 Djnz    !r6,L_Rd_Lp
2372 5A B6          9994                 Djnz    !r5,L_SprTbl_Lp
2374                9995                 
2374 42 44        6 9996                 Or      !r4,!r4 ;check if any spare table found
2376 EB 66          9997                 Jr      Nz,L_Spr_End
2378                9998                 
2378 D6 05 1F    20 9999                 Call    Abort
237B               10000                 
237B E6 42 12    1010001 Chk_SprTbl:      Ld     ScrReg2,#.HIBYTE. ( RBuffer1+BlockID )
237E E6 43 19    1010002                  Ld     ScrReg3,#.LOWBYTE. ( RBuffer1+BlockID )
2381 D6 24 E6    2010003                 Call    Chk_PassWord





        WIDGET.ASSEM            Page 316
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2384 6B E8         10004                 Jr      Z,L_SprTbl_More
2386               10005                 
2386 E6 42 10    1010006                  Ld     ScrReg2,#.HIBYTE. RBuffer1
2389 E6 43 19    1010007                  Ld     ScrReg3,#.LOWBYTE. RBuffer1
238C D6 24 E6    2010008                 Call    Chk_PassWord
238F 6B DD         10009                 Jr      Z,L_SprTbl_More
2391               10010                 
2391 2C 11        610011                 Ld      !r2,#.HIBYTE. ( RBuffer1+SpareCheck-SpareArray )
2393 3C F2        610012                 Ld      !r3,#.LOWBYTE. ( RBuffer1+SpareCheck-SpareArray )
2395 82 02       1210013                 Lde     !r0,@!!r2 ;check possible check byte
2397 A0 E2       1010014                 Incw    !!r2
2399 82 12       1210015                 Lde     !r1,@!!r2
239B               10016                 
239B 31 40        610017                 Srp     #Wrk_Scr
239D CC 10        610018                  Ld     !rC,#.HIBYTE. RBuffer1
239F DC 19        610019                  Ld     !rD,#.LOWBYTE. RBuffer1
23A1 D6 23 F9    2010020                 Call    SprChk2
23A4               10021                 
23A4 31 10        610022                 Srp     #Wrk_Sys
23A6 D6 24 28    2010023                 Call    Chk_Spr2
23A9 6B C3         10024                 Jr      Z,L_SprTbl_More
23AB               10025                 
23AB 42 44        610026                 Or      !r4,!r4 ;check for a SpareTable already found
23AD 6B 22         10027                 Jr      Z,L_Spr_Move
23AF               10028                  
23AF 31 40        610029                 Srp     #Wrk_Scr
23B1 6C 14        610030                  Ld     !r6,#.HIBYTE. SpareTmStmp
23B3 7C BF        610031                  Ld     !r7,#.LOWBYTE. SpareTmStmp
23B5 4C 40        610032                  Ld     !r4,#ScrReg0
23B7 D6 23 EE    2010033                 Call    Ld_TmStmp
23BA 6C 10        610034                  Ld     !r6,#.HIBYTE. ( RBuffer1+SpareTmStmp-SpareArray )
23BC 7C 1D        610035                  Ld     !r7,#.LOWBYTE. ( RBuffer1+SpareTmStmp-SpareArray )
23BE 4C 4C        610036                  Ld     !r4,#ScrRegC
23C0 D6 23 EE    2010037                 Call    Ld_TmStmp
23C3 22 3F        610038                 Sub     !r3,!rF
23C5 32 2E        610039                 Sbc     !r2,!rE
23C7 32 1D        610040                 Sbc     !r1,!rD
23C9 32 0C        610041                 Sbc     !r0,!rC
23CB 31 10        610042                 Srp     #Wrk_Sys
23CD 9B 09         10043                 Jr      Ge,L_Spr_Inc
23CF 00 E4        610044                 Dec     !r4     ;account for old, bogus spare table
23D1               10045                 
23D1 2C 20        610046 L_Spr_Move:      Ld     !r2,#.HIBYTE. RBuf_To_Spr
23D3 3C 7F        610047                  Ld     !r3,#.LOWBYTE. RBuf_To_Spr
23D5 D6 04 AB    2010048                 Call    Bank_Call
23D8               10049                 
23D8 4E           610050 L_Spr_Inc:      Inc     !r4     ;note the arrival of a SpareTable
23D9 A6 E4 02    1010051                 Cp      !r4,#2  ;see if that's all there is
23DC EB 90         10052                 Jr      Nz,L_SprTbl_More
23DE               10053                 
23DE D6 24 51    2010054 L_Spr_End:      Call    UpDate_SprTbl
23E1 56 25 FE    1010055                 And     SlfTst_Result,#$FF-No_SprTbl
23E4               10056                 
23E4 2C 29        610057                  Ld     !r2,#.HIBYTE. Park_Heads





        WIDGET.ASSEM            Page 317
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


23E6 3C 43        610058                  Ld     !r3,#.LOWBYTE. Park_Heads
23E8 D6 04 AB    2010059                 Call    Bank_Call
23EB 8D 04 F8      10060                 Jp      Bank_Ret
23EE               10061                 
23EE               10062 ;*******************************
23EE               10063 
23EE 5C 04        610064 Ld_TmStmp:      Ld     !r5,#4 ;load 4 bytes
23F0 83 46       1810065 Ld_Tm_Lp:       Ldei   @!r4,@!!r6
23F2 5A FC         10066                 Djnz   !r5,Ld_Tm_Lp
23F4 AF          1410067                 Ret
23F5               10068                  
23F5               10069                 .LSTOFF
23F5               10071                 .LSTON














































        WIDGET.ASSEM            Page 318
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


23F5               10072                 .Page
23F5               10073 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
23F5               10074 ;>
23F5               10075 ;>      Procedure: SprChkSum
23F5               10076 ;>
23F5               10077 ;>      This procedure calculates a 16-bit checksum over the contents
23F5               10078 ;>      of the spare table, and stores the sum within the spare table.
23F5               10079 ;>
23F5               10080 ;>      Inputs: { none }
23F5               10081 ;>
23F5               10082 ;>      Outputs: { none }
23F5               10083 ;>
23F5               10084 ;>      Side Effect: ScrReg1, ScrReg2 hold the calculated check byte on return
23F5               10085 ;>
23F5               10086 ;>      Algorithm:
23F5               10087 ;>
23F5               10088 ;>      BEGIN
23F5               10089 ;>       Sum := 0
23F5               10090 ;>       SumPtr := SpareArray
23F5               10091 ;>       FOR i := 1 TO Length( SpareArray ) DO
23F5               10092 ;>        Sum := Sum + SpareArray[ i - 1 ]
23F5               10093 ;>       SpareArray.CheckSum := Sum
23F5               10094 ;>      END
23F5               10095 ;>
23F5               10096 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
23F5               10097                 .LSTOFF
23F5               10100                 .LSTON
































        WIDGET.ASSEM            Page 319
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


23F5               10101                 .Page
23F5               10102                 .FIN
23F5               10103 
23F5               10104 SprChkSum:
23F5 CC 14        610105                 Ld      !rC,#.HIBYTE. SpareArray
23F7 DC BB        610106                 Ld      !rD,#.LOWBYTE. SpareArray
23F9               10107                 
23F9 EC 01        610108 SprChk2:        Ld      !rE,#.HIBYTE. ( SpareCheck - SpareArray )
23FB FC D9        610109                 Ld      !rF,#.LOWBYTE. ( SpareCheck - SpareArray )
23FD               10110                 
23FD B0 E1        610111                 Clr     !r1
23FF B0 E2        610112                 Clr     !r2
2401               10113                 
2401 82 0C       1210114 SprChk_Lp:      Lde     !r0,@!!rC
2403 02 20        610115                 Add     !r2,!r0
2405 16 E1 00    1010116                 Adc     !r1,#0
2408 A0 EC       1010117                 Incw    !!rC
240A 80 EE       1010118                 Decw    !!rE
240C EB F3         10119                 Jr      Nz,SprChk_Lp
240E               10120                 
240E 92 1C       1210121                 Lde     @!!rC,!r1 ;store hibyte of checksum
2410 A0 EC       1010122                 Incw    !!rC
2412 92 2C       1210123                 Lde     @!!rC,!r2 ;store low byte of checksum
2414               10124                 
2414 8D 04 F8      10125                 Jp      Bank_Ret
2417               10126                 
2417               10127                 .LSTOFF
2417               10129                 .LSTON































        WIDGET.ASSEM            Page 320
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2417               10130                 .Page
2417               10131 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2417               10132 ;>
2417               10133 ;>      Function: Chk_SprChk
2417               10134 ;>
2417               10135 ;>      This function is responsible for verifying that the checksum
2417               10136 ;>      residing in the spare table is correct.
2417               10137 ;>
2417               10138 ;>      Inputs: { none }
2417               10139 ;>
2417               10140 ;>      Outputs:
2417               10141 ;>              Chk_SprChk : BOOLEAN { zero flag }
2417               10142 ;>
2417               10143 ;>      Algorithm:
2417               10144 ;>
2417               10145 ;>      BEGIN
2417               10146 ;>       TempSum := SpareTable.CheckSum
2417               10147 ;>       SpareTable.CheckSum := SprChkSum
2417               10148 ;>       IF ( TempSum = SpareTable.CheckSum )
2417               10149 ;>        THEN Chk_SprChk := True
2417               10150 ;>        ELSE Chk_SprChk := False
2417               10151 ;>      END
2417               10152 ;>
2417               10153 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2417               10154                 .LSTOFF
2417               10157                 .LSTON

































        WIDGET.ASSEM            Page 321
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2417               10158                 .Page
2417               10159                 .FIN
2417               10160 
2417               10161 Chk_SprChk:
2417 2C 16        610162                 Ld      !r2,#.HIBYTE. SpareCheck
2419 3C 94        610163                 Ld      !r3,#.LOWBYTE. SpareCheck
241B 82 02       1210164                 Lde     !r0,@!!r2
241D A0 E2       1010165                 Incw    !!r2
241F 82 12       1210166                 Lde     !r1,@!!r2
2421               10167                 
2421 31 40        610168                  Srp    #Wrk_Scr
2423 D6 23 F5    2010169                 Call    SprChkSum
2426 31 10        610170                  Srp    #Wrk_Sys
2428               10171 
2428 B4 41 E0    1010172 Chk_Spr2:       Xor     !r0,ScrReg1 ;side effect: ScrReg2:3 hold new checkyte
242B B4 42 E1    1010173                 Xor     !r1,ScrReg2
242E 42 01        610174                 Or      !r0,!r1
2430 B0 E0        610175                 Clr     !r0
2432 EB 02         10176                 Jr      Nz,Chk_Spr_End
2434               10177                 
2434 0C 01        610178                 Ld      !r0,#1
2436               10179                 
2436 42 00        610180 Chk_Spr_End:    Or      !r0,!r0 ;set zero flag
2438 8D 04 F8      10181                 Jp      Bank_Ret
243B               10182                 
243B               10183                 .LSTOFF
243B               10185                 .LSTON
































        WIDGET.ASSEM            Page 322
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


243B               10186                 .Page
243B               10187 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
243B               10188 ;>
243B               10189 ;>      Function: Spr
243B               10190 ;>
243B               10191 ;>      This function returns the logical block number associated
243B               10192 ;>      with the parameter passed in. Because there are only two spare
243B               10193 ;>      blocks containing the spare table, this function accepts
243B               10194 ;>      only ODD or EVEN input params.
243B               10195 ;>
243B               10196 ;>      Inputs:
243B               10197 ;>              SpareTableIndex : BYTE { !r8 }
243B               10198 ;>
243B               10199 ;>      Outputs:
243B               10200 ;>              Spr : 3 BYTES { !rC:E }
243B               10201 ;>
243B               10202 ;>      Algorithm:
243B               10203 ;>
243B               10204 ;>      BEGIN
243B               10205 ;>       IF SpareTableIndex is EVEN
243B               10206 ;>        THEN Spr := SprBlk0
243B               10207 ;>        ELSE Spr := SprBlk1
243B               10208 ;>      END
243B               10209 ;>
243B               10210 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
243B               10211                 .LSTOFF
243B               10214                 .LSTON
































        WIDGET.ASSEM            Page 323
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


243B               10215                 .Page
243B               10216                 .FIN
243B               10217 
243B               10218 Spr:
243B 56 E8 01    1010219                 And     !r8,#$01 ;IF SpareTableIndex is EVEN
243E EB 08         10220                 Jr      Nz,Spr_Odd
2440               10221                 
2440 CC 00        610222                 Ld      !rC,#HiSpr0
2442 DC 19        610223                 Ld      !rD,#MidSpr0
2444 EC 55        610224                 Ld      !rE,#LoSpr0
2446 8B 06         10225                 Jr      Spr_End
2448               10226                 
2448 CC 00        610227 Spr_Odd:        Ld      !rC,#HiSpr1
244A DC 32        610228                 Ld      !rD,#MidSpr1
244C EC AA        610229                 Ld      !rE,#LoSpr1
244E               10230                 
244E 8D 04 F8      10231 Spr_End:        Jp      Bank_Ret
2451               10232 
2451               10233                 .LSTOFF
2451               10235                 .LSTON







































        WIDGET.ASSEM            Page 324
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2451               10236                 .Page
2451               10237 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2451               10238 ;>
2451               10239 ;>      Procedure: UpDate_SprTbl
2451               10240 ;>
2451               10241 ;>      This procedure is responsible for updating the spare table
2451               10242 ;>      to both of its locations on disk after a change has been made
2451               10243 ;>      to the table.
2451               10244 ;>
2451               10245 ;>      Inputs: { none }
2451               10246 ;>
2451               10247 ;>      Outputs: { none }
2451               10248 ;>
2451               10249 ;>      Algorithm:
2451               10250 ;>
2451               10251 ;>      BEGIN
2451               10252 ;>       SpareTmStamp := SpareTmStamp + 1
2451               10253 ;>       SprChkSum
2451               10254 ;>       ZeroBlock
2451               10255 ;>       WBuffer1.BlockID := PassWord
2451               10256 ;>       FOR i := 0 TO 1 DO
2451               10257 ;>         MoveBlock( WriteBuffer, SpareTable )
2451               10258 ;>         TempCyl, TempHead, TempSector := Get_Cyl_H_S( 
2451               10259 ;>                                       SrchSpTabl( SpareTable, Spr( i ) ) )
2451               10260 ;>         IF table not found in SpareTable THEN Abort
2451               10261 ;>         Seek( TempCyl, TempHead, TempSector )
2451               10262 ;>         IF NOT( WriteVerify( Conservative ) )
2451               10263 ;>          THEN
2451               10264 ;>           IF Recovery AND ( WriteVerify.ErrorCode = Ex_ReadErr )
2451               10265 ;>            THEN EXIT UpDate_SprTbl
2451               10266 ;>            ELSE
2451               10267 ;>             ZeroBlock
2451               10268 ;>             WriteBlock
2451               10269 ;>             MoveBlock( Buffer2, SpareTable )
2451               10270 ;>             SpareBlock( True, SpareTable, Write_Op, Spr( i ) )
2451               10271 ;>
2451               10272 ;>      END
2451               10273 ;>
2451               10274 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2451               10275                 .LSTOFF
2451               10278                 .LSTON


















        WIDGET.ASSEM            Page 325
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2451               10279                 .Page
2451               10280                 .FIN
2451               10281                 
2451               10282 UpDate_SprTbl:  
2451 2C 14        610283                 Ld      !r2,#.HIBYTE. SpareTmStamp
2453 3C BF        610284                 Ld      !r3,#.LOWBYTE. SpareTmStamp
2455 0C 1C        610285                 Ld      !r0,#Wrk_Sys+$C
2457 1C 04        610286                 Ld      !r1,#4 ;get 4 bytes
2459 83 02       1810287 UpDate_1:       Ldei    @!r0,@!!r2
245B 1A FC         10288                 Djnz    !r1,UpDate_1
245D 06 EF 01    1010289                 Add     !rF,#1 ;increment the count
2460 16 EE 00    1010290                 Adc     !rE,#0
2463 16 ED 00    1010291                 Adc     !rD,#0
2466 16 EC 00    1010292                 Adc     !rC,#0
2469 0C 1C        610293                 Ld      !r0,#Wrk_Sys+$C
246B 1C 04        610294                 Ld      !r1,#4 ;move 4 bytes
246D 2C 14        610295                 Ld      !r2,#.HIBYTE. SpareTmStamp
246F 3C BF        610296                 Ld      !r3,#.LOWBYTE. SpareTmStamp
2471 93 02       1810297 UpDate_2:       Ldei    @!!r2,@!r0
2473 1A FC         10298                 Djnz    !r1,UpDate_2
2475               10299                 
2475 D6 23 F5    2010300                 Call    SprChkSum
2478               10301                 
2478 4C 02        610302                 Ld      !r4,#2 ;write the table to the disk twice
247A B0 E5        610303                 Clr     !r5 ;spare table index
247C               10304                 
247C D6 20 A2    2010305 SprB_Lp:        Call    Spr_To_WrBuf
247F               10306                 
247F EC 12        610307                  Ld     !rE,#.HIBYTE. ( WBuffer1 + BlockID )
2481 FC 21        610308                  Ld     !rF,#.LOWBYTE. ( WBuffer1 + BlockID )
2483 D6 25 07    2010309                 Call    Load_PassWord
2486               10310                 
2486 88 E5        610311                  Ld     !r8,!r5
2488 D6 24 3B    2010312                 Call    Spr
248B               10313                 
248B E6 58 08    1010314                 Ld      Data_Type,#Spr_Tbl_Type
248E 2C 16        610315                  Ld     !r2,#.HIBYTE. CnvrtLogical
2490 3C 46        610316                  Ld     !r3,#.LOWBYTE. CnvrtLogical
2492 D6 04 AB    2010317                 Call    Bank_Call
2495 EB 03         10318                 Jr      Nz,SprB_Seek
2497               10319                 
2497 D6 05 1F    2010320                 Call    Abort
249A               10321                 
249A E6 57 90    1010322 SprB_Seek:      Ld      Seek_Type,#Access_Offset
249D D6 05 D7    2010323                 Call    New_Seek
24A0               10324                 
24A0 E6 5A 01    1010325                  Ld     BlkStat,#S_Block ;say that we've got a spare block
24A3 E6 58 08    1010326                  Ld     Data_Type,#SprTbl_Type ;ditto
24A6 E6 27 0A    1010327                  Ld     RdErrCnt,#10 ;prime the counter for write error
24A9 2C 19        610328                  Ld     !r2,#.HIBYTE. WrVer_Common
24AB 3C 70        610329                  Ld     !r3,#.LOWBYTE. WrVer_Common
24AD D6 04 AB    2010330                 Call    Bank_Call
24B0 EB 2E         10331                 Jr      Nz,Spr_Next
24B2               10332                 





        WIDGET.ASSEM            Page 326
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


24B2 76 24 80    1010333                 Tm      Excpt_Stat,#Recovery ;IF Recovery THEN ...
24B5 EB 03         10334                 Jr      Nz,Rcvr_SprTbl
24B7               10335                 
24B7 D6 05 1F    2010336                 Call    Abort
24BA               10337                 
24BA 18 27        610338 Rcvr_SprTbl:    Ld      !r1,RdErrCnt ;check for noisy read
24BC 56 E1 0F    1010339                 And     !r1,#$0F
24BF A6 E1 03    1010340                 Cp      !r1,#SprThresh
24C2 2B 1C         10341                 Jr      Le,Spr_Next
24C4               10342                 
24C4 2C 10        610343                  Ld     !r2,#.HIBYTE. WBuffer1
24C6 3C 21        610344                  Ld     !r3,#.LOWBYTE. WBuffer1
24C8 D6 22 80    2010345                 Call    ZeroBlock
24CB               10346                 
24CB 2C 18        610347                  Ld     !r2,#.HIBYTE. Wr_Common
24CD 3C DB        610348                  Ld     !r3,#.LOWBYTE. Wr_Common
24CF D6 04 AB    2010349                 Call    Bank_Call
24D2               10350                 
24D2 88 E5        610351                  Ld     !r8,!r5
24D4 D6 24 3B    2010352                  Call   Spr
24D7 2C 13        610353                  Ld     !r2,#.HIBYTE. SprEnter
24D9 3C F6        610354                  Ld     !r3,#.LOWBYTE. SprEnter
24DB D6 04 AB    2010355                 Call    Bank_Call
24DE 6B DA         10356                 Jr      Z,Rcvr_SprTbl
24E0               10357                 
24E0 5E           610358 Spr_Next:       Inc     !r5 ;do next table
24E1 4A 99         10359                 Djnz    !r4,SprB_Lp
24E3 8D 04 F8      10360                 Jp      Bank_Ret
24E6               10361                 
24E6               10362                 .LSTOFF
24E6               10364                 .LSTON




























        WIDGET.ASSEM            Page 327
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


24E6               10365                 .Page
24E6               10366 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
24E6               10367 ;>
24E6               10368 ;>      Function: Chk_PassWord
24E6               10369 ;>
24E6               10370 ;>      This function is responsible for checking if the 32 bits
24E6               10371 ;>      pointed to by the input parameter match with the controller's
24E6               10372 ;>      32 bit password.
24E6               10373 ;>
24E6               10374 ;>      Inputs:
24E6               10375 ;>              PassWordPtr : PTR { ScrReg2:3 }
24E6               10376 ;>
24E6               10377 ;>      Outputs:
24E6               10378 ;>              Chk_PassWord : BOOLEAN { zero flag }
24E6               10379 ;>
24E6               10380 ;>      Algoritm:
24E6               10381 ;>
24E6               10382 ;>      BEGIN
24E6               10383 ;>       IF ( (PassWordPtr) = PassWord )
24E6               10384 ;>        THEN Chk_PassWord := True
24E6               10385 ;>        ELSE Chk_PassWord := False
24E6               10386 ;>      END
24E6               10387 ;>
24E6               10388 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
24E6               10389                 .LSTOFF
24E6               10392                 .LSTON

































        WIDGET.ASSEM            Page 328
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


24E6               10393                 .Page
24E6               10394                 .FIN
24E6               10395                 
24E6               10396 Chk_PassWord:
24E6 31 40        610397                 Srp     #Wrk_Scr
24E8 4C 04        610398                 Ld      !r4,#4 ;check 4 bytes
24EA               10399 
24EA EC 10        610400                 Ld      !rE,#.HIBYTE. PassWord
24EC FC 03        610401                 Ld      !rF,#.LOWBYTE. PassWord
24EE               10402                 
24EE C2 0E       1210403 Chk_P_Lp:       Ldc     !r0,@!!rE ;get a byte of the password
24F0 A0 EE       1010404                 Incw    !!rE
24F2 82 12       1210405                 Lde     !r1,@!!r2 ;get a byte of test string
24F4 A0 E2       1010406                 Incw    !!r2
24F6 A2 01        610407                 Cp      !r0,!r1
24F8 B0 E0        610408                 Clr     !r0 ;assume failure
24FA EB 04         10409                 Jr      Nz,Chk_P_End
24FC 4A F0         10410                 Djnz    !r4,Chk_P_Lp
24FE               10411                 
24FE 0C 01        610412                 Ld      !r0,#1
2500               10413                 
2500 42 00        610414 Chk_P_End:      Or      !r0,!r0 ;set flags
2502 31 10        610415                 Srp     #Wrk_Sys
2504 8D 04 F8      10416                 Jp      Bank_Ret
2507               10417                 
2507               10418                 .LSTOFF
2507               10420                 .LSTON
































        WIDGET.ASSEM            Page 329
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2507               10421                 .Page
2507               10422 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2507               10423 ;>
2507               10424 ;>      Procedure: Load_PassWord
2507               10425 ;>
2507               10426 ;>      This procedure loads the 32-bit password into the memory
2507               10427 ;>      location pointed to by the input parameter.
2507               10428 ;>
2507               10429 ;>      Inputs:
2507               10430 ;>              Destination : PTR { !!rE }
2507               10431 ;>
2507               10432 ;>      Outputs: { none }
2507               10433 ;>
2507               10434 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2507               10435                 .LSTOFF
2507               10438                 .LSTON











































        WIDGET.ASSEM            Page 330
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2507               10439                 .Page
2507               10440                 .FIN
2507               10441 
2507               10442 Load_PassWord:
2507 2C 10        610443                 Ld     !r2,#.HIBYTE. PassWord
2509 3C 03        610444                 Ld     !r3,#.LOWBYTE. PassWord
250B 1C 04        610445                 Ld     !r1,#4 ;move 4 bytes
250D               10446                  
250D C2 02       1210447 Lpw_Lp:         Ldc     !r0,@!!r2
250F 92 0E       1210448                 Lde     @!!rE,!r0
2511 A0 E2       1010449                 Incw    !!r2
2513 A0 EE       1010450                 Incw    !!rE
2515 1A F6         10451                 Djnz    !r1,Lpw_Lp
2517               10452                 
2517 8D 04 F8      10453                 Jp      Bank_Ret
251A               10454                 
251A               10455                 .LSTOFF
251A               10457                 .LSTON









































        WIDGET.ASSEM            Page 331
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


251A               10458                 .Page
251A               10459 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
251A               10460 ;>
251A               10461 ;>      Procedure: SpareCount
251A               10462 ;>
251A               10463 ;>      This procedure is responsible for incrementing/decrementing
251A               10464 ;>      the Spare/Bad Block count. If the total count exceeds
251A               10465 ;>      MaxSpares-5 then a status bit is set for this command only.
251A               10466 ;>
251A               10467 ;>      Inputs:
251A               10468 ;>              Command : 2 BITS { !r0/Bits 1:0 }
251A               10469 ;>
251A               10470 ;>      Outputs: { none }
251A               10471 ;>
251A               10472 ;>      Algorithm:
251A               10473 ;>
251A               10474 ;>      BEGIN
251A               10475 ;>       CASE Command OF
251A               10476 ;>        0 : Increment the spare count
251A               10477 ;>        1 : Increment the bad block count
251A               10478 ;>        2 : Decrement the bad block count
251A               10479 ;>       OTHERWISE Abort
251A               10480 ;>
251A               10481 ;>       IF ( SpareCount+BadBlockCount >= MaxSpares-5 )
251A               10482 ;>        THEN 
251A               10483 ;>              Excpt_Status.SprTbl_Warn := True
251A               10484 ;>              SetStatus( SprBlk_Warn )
251A               10485 ;>      END
251A               10486 ;>
251A               10487 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
251A               10488                 .LSTOFF
251A               10491                 .LSTON



























        WIDGET.ASSEM            Page 332
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


251A               10492                 .Page
251A               10493                 .FIN
251A               10494 
251A               10495 SpareCount:
251A 18 E0        610496                 Ld      !r1,!r0 ;get command
251C 56 E1 FC    1010497                 And     !r1,#$FC ;check for illegal command
251F 6B 05         10498                 Jr      Z,SprCnt_1
2521               10499                 
2521 98 E0        610500                 Ld      !r9,!r0
2523 D6 05 1F    2010501                 Call    Abort
2526               10502                 
2526 2C 15        610503 SprCnt_1:       Ld      !r2,#.HIBYTE. SprCount
2528 3C 45        610504                 Ld      !r3,#.LOWBYTE. SprCount
252A 82 12       1210505                 Lde     !r1,@!!r2 ;assume spare count increment
252C 1E           610506                 Inc     !r1
252D               10507                 
252D A6 E0 00    1010508                 Cp      !r0,#0 ;check for Inc_SpareCount
2530 6B 12         10509                 Jr      Z,S_C_Spare
2532               10510                 
2532 A0 E2       1010511                 Incw    !!r2 ;get address of BadCount
2534 82 12       1210512                 Lde     !r1,@!!r2 ;get bad block count
2536               10513                 
2536 A6 E0 01    1010514                 Cp      !r0,#01 ;check for Inc_BadBlock
2539 6B 04         10515                 Jr      Z,S_C_BadInc
253B               10516                 
253B 00 E1        610517                 Dec     !r1 ;otherwise Decrement bad block count
253D 8B 01         10518                 Jr      S_C_BadEnd
253F               10519                 
253F 1E           610520 S_C_BadInc:     Inc     !r1
2540 92 12       1210521 S_C_BadEnd:     Lde     @!!r2,!r1 ;store new count
2542 8B 02         10522                 Jr      SprCnt_End
2544               10523                 
2544 92 12       1210524 S_C_Spare:      Lde     @!!r2,!r1 ;store new count
2546 D6 25 4C    2010525 SprCnt_End:     Call    Chk_SprCnt
2549 8D 04 F8      10526 SprCnt_Ret:     Jp      Bank_Ret
254C               10527 
254C               10528 
254C 2C 15        610529 Chk_SprCnt:     Ld      !r2,#.HIBYTE. SprCount
254E 3C 45        610530                 Ld      !r3,#.LOWBYTE. SprCount
2550 82 02       1210531                 Lde     !r0,@!!r2 ;get spare count
2552 A0 E2       1010532                 Incw    !!r2
2554 82 12       1210533                 Lde     !r1,@!!r2 ;get bad count
2556 02 01        610534                 Add     !r0,!r1 ;get total
2558 A6 E0 47    1010535                 Cp      !r0,#71 ;check for spare count overflow
255B 1B 06         10536                 Jr      Lt,Chk_Spr_Ret
255D               10537                 
255D 46 24 40    1010538                 Or      Excpt_Stat,#SprTbl_Warn
2560 D6 05 A8    2010539                 Call    SS_SprWarn
2563               10540                 
2563 8D 04 F8      10541 Chk_Spr_Ret:    Jp      Bank_Ret
2566               10542 
2566               10543                 .LSTOFF
2566               10549                 .LSTON






        WIDGET.ASSEM            Page 333
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2566               10550                 .Page
2566               10551 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2566               10552 ;>
2566               10553 ;>      Module: Math
2566               10554 ;>
2566               10555 ;>      BANK 1 MODULE
2566               10556 ;>
2566               10557 ;>      This module contains all the special purpose math routines
2566               10558 ;>      used in the Widget firmware.
2566               10559 ;>
2566               10560 ;>      FUNCTION Div3_19( A : 3 BYTES { !rC:E } ) : 3 BYTES { !r0:2 }
2566               10561 ;>      FUNCTION Div3_38( A : 3 BYTES { !rC:E } ) : 3 BYTES { !r0:2 }
2566               10562 ;>      FUNCTION Div3_76( A : 3 BYTES { !rC:E } ) : 3 BYTES { !r0:2 }
2566               10563 ;>      FUNCTION MulR0_m( R0 : BYTE { !r0 } ) : 3 BYTES { !r0:2 }
2566               10564 ;>      FUNCTION DivHdsSctrs( A : 3 BYTES { !r0:2 } ) :
2566               10565 ;>                       Quotient : BYTE { !r0:1 }
2566               10566 ;>                       Remainder : BYTE { !r3 }
2566               10567 ;>      FUNCTION DivSctrs( A : BYTE { !r3 } ) :
2566               10568 ;>                       Quotient : BYTE { !r2 }
2566               10569 ;>                       Remainder : BYTE { !r3 }
2566               10570 ;>
2566               10571 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2566               10572                 .LSTOFF
2566               10575                 .LSTON



































        WIDGET.ASSEM            Page 334
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2566               10576                 .Page
2566               10577 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2566               10578 ;>
2566               10579 ;>      Function: Div3_k, Div3_19, Div3_38, Div3_76
2566               10580 ;>
2566               10581 ;>      This function performs the following 24 bit arithmetic operations:
2566               10582 ;>
2566               10583 ;>      Div3_19 : Result <-- A DIV 19
2566               10584 ;>
2566               10585 ;>      Div3_76 : Result <-- A DIV 76
2566               10586 ;>
2566               10587 ;>      Inputs:
2566               10588 ;>              A: 3 BYTES { !rC, !rD, !rE }
2566               10589 ;>
2566               10590 ;>      Outputs:
2566               10591 ;>              Result: 3 BYTES { !r0, !r1, !r2 }
2566               10592 ;>
2566               10593 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2566               10594                 .LSTOFF
2566               10597                 .LSTON







































        WIDGET.ASSEM            Page 335
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2566               10598                 .Page
2566               10599                 .FIN
2566               10600 ;>>>>>>>>>>>>>>>>>>>>>
2566               10601 ;>
2566               10602 ;>      Div3_19: Quotient := Dividend DIV 19
2566               10603 ;>
2566               10604 ;>      Local Variables:
2566               10605 ;>              Divisor : 3 BYTES { !rC:E }
2566               10606 ;>              Quotient : 3 BYTES { !r7:9 }
2566               10607 ;>              Dividend : 3 BYTES { !r4:6 }
2566               10608 ;>
2566               10609 ;>      BEGIN
2566               10610 ;>       Divisor := $013000 { 19 * 2^( 13 - 1 ) }
2566               10611 ;>       Qoutient := 0
2566               10612 ;>       FOR i := 1 TO 13 DO
2566               10613 ;>        IF ( Dividend >= Divisor )
2566               10614 ;>         THEN
2566               10615 ;>              Dividend := Dividend - Divisor
2566               10616 ;>              Quotient := ( Quotient * 2 ) + 1
2566               10617 ;>         ELSE Quotient := ( Quotient * 2 )
2566               10618 ;>       Divisor := Divisor DIV 2
2566               10619 ;>      END
2566               10620 ;>
2566               10621 ;>>>>>>>>>>>>>>>>>>>>>
2566 E6 4C 04    1010622 Div3_76:        Ld      ScrRegC,#$04 ;Divisor := $04C000
2569 E6 4D C0    1010623                 Ld      ScrRegD,#$C0
256C E6 4E 00    1010624                 Ld      ScrRegE,#$00
256F 8B 14         10625                 Jr      Div3_x
2571               10626 
2571 E6 4C 02    1010627 Div3_38:        Ld      ScrRegC,#$02 ;Divisor := $026000
2574 E6 4D 60    1010628                 Ld      ScrRegD,#$60
2577 E6 4E 00    1010629                 Ld      ScrRegE,#$00
257A 8B 09         10630                 Jr      Div3_x
257C               10631 
257C               10632 
257C E6 4C 01    1010633 Div3_19:        Ld      ScrRegC,#$01 ;Divisor := $013000
257F E6 4D 30    1010634                 Ld      ScrRegD,#$30
2582 E6 4E 00    1010635                 Ld      ScrRegE,#$00
2585               10636                 
2585 C9 44        610637 Div3_x:         Ld      ScrReg4,!rC ;pass dividend to routine
2587 D9 45        610638                 Ld      ScrReg5,!rD
2589 E9 46        610639                 Ld      ScrReg6,!rE
258B               10640                 
258B 70 FD         10641                 Push    Rp ;save context
258D 31 40        610642                 Srp     #Wrk_Scr
258F               10643                 
258F B0 E7        610644                 Clr     !r7 ;Quotient := 0
2591 B0 E8        610645                 Clr     !r8
2593 B0 E9        610646                 Clr     !r9
2595               10647                 
2595 AC 0D        610648                 Ld      !rA,#13 ; FOR i := 1 TO 13 DO
2597               10649                 
2597 CF           610650 Div3_19_Lp:     Rcf             ;clear carry
2598 10 E9        610651                 Rlc     !r9 ;Quotient := Quotient * 2





        WIDGET.ASSEM            Page 336
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


259A 10 E8        610652                 Rlc     !r8
259C 10 E7        610653                 Rlc     !r7
259E               10654                  
259E 08 E4        610655                  Ld     !r0,!r4 ;IF ( Dividend >= Divisor )
25A0 18 E5        610656                  Ld     !r1,!r5
25A2 28 E6        610657                  Ld     !r2,!r6
25A4 D6 03 A5    2010658                 Call    Sub3
25A7 7B 0F         10659                 Jr      C,Div3_19_Div2
25A9               10660                 
25A9 48 E0        610661                 Ld      !r4,!r0 ;Dividend := Dividend - Divisor
25AB 58 E1        610662                 Ld      !r5,!r1
25AD 68 E2        610663                 Ld      !r6,!r2
25AF               10664                 
25AF 06 E9 01    1010665                 Add     !r9,#1 ;quotient := quotient + 1
25B2 16 E8 00    1010666                 Adc     !r8,#0
25B5 16 E7 00    1010667                 Adc     !r7,#0
25B8               10668                 
25B8 CF           610669 Div_3_19_Div2:  Rcf             ;clear carry flag
25B9 C0 EC        610670                 Rrc     !rC ;Divisor := Divisor DIV 2
25BB C0 ED        610671                 Rrc     !rD
25BD C0 EE        610672                 Rrc     !rE
25BF               10673                 
25BF AA D6         10674                 Djnz    !rA,Div3_19_Lp
25C1               10675                 
25C1 50 FD       1010676                 Pop     Rp ;context switch
25C3 08 47        610677                 Ld      !r0,ScrReg7 ;pass quotient to caller
25C5 18 48        610678                 Ld      !r1,ScrReg8
25C7 28 49        610679                 Ld      !r2,ScrReg9
25C9               10680                 
25C9 8D 04 F8      10681                 Jp      Bank_Ret
25CC               10682                 
25CC               10683                 .LSTOFF
25CC               10685                 .LSTON


























        WIDGET.ASSEM            Page 337
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


25CC               10686                 .Page
25CC               10687 ;>>>>>>>>>>>>>>>>>>>>>>>>>
25CC               10688 ;>
25CC               10689 ;>      Function: MulR0_m  { Multiply R0 by m }
25CC               10690 ;>
25CC               10691 ;>      This function muliplies the byte in !r0 by m where:
25CC               10692 ;>
25CC               10693 ;>      For 10Mbyte Profile: m = 256
25CC               10694 ;>      For 20MByte Profile: m = 512
25CC               10695 ;>      For 30MByte Profile: m = 1024
25CC               10696 ;>
25CC               10697 ;>      Inputs:
25CC               10698 ;>              A : BYTE { !r0 }
25CC               10699 ;>
25CC               10700 ;>      Outputs:
25CC               10701 ;>              Result : 3 BYTES { !rC, !rD, !rE }
25CC               10702 ;>
25CC               10703 ;>>>>>>>>>>>>>>>>>>>>>>>>>
25CC               10704                 .FIN
25CC               10705                 .DO     Internal
25CC               10706                 .LSTON
25CC               10707                 .FIN
25CC               10708                 
25CC               10709 MulR0_m:
25CC B0 EE        610710                 Clr     !rE     ;Result := !r0 * 256
25CE D8 E0        610711                 Ld      !rD,!r0
25D0 B0 EC        610712                 Clr     !rC
25D2               10713                 
25D2               10714                 .LSTOFF
25D2               10733                 .LSTON
25D2               10734                 .FIN
25D2               10735                 
25D2 8D 04 F8      10736                 Jp      Bank_Ret
25D5               10737                 
25D5               10738                 .LSTOFF
25D5               10740                 .LSTON























        WIDGET.ASSEM            Page 338
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


25D5               10741                 .Page
25D5               10742 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
25D5               10743 ;>
25D5               10744 ;>      Function: DivHdsSctrs  { Divide by Heads * Sectors }
25D5               10745 ;>
25D5               10746 ;>      This function takes the 24 bit word passed to it and returns
25D5               10747 ;>      a 2 byte integer ( representing the cylinder number ) and
25D5               10748 ;>      the remainder from the divide.
25D5               10749 ;>
25D5               10750 ;>      Inputs:
25D5               10751 ;>              A : 3 BYTES { !rC, !rD, !rE }
25D5               10752 ;>
25D5               10753 ;>      Outputs:
25D5               10754 ;>              Cylinder : WORD { !!r0 }
25D5               10755 ;>              Remainder : 1 BYTE { !r3 }
25D5               10756 ;>
25D5               10757 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
25D5               10758                 .LSTOFF
25D5               10761                 .LSTON
25D5               10762                 .FIN
25D5               10763                 
25D5               10764 DivHdsSctrs:
25D5               10765                 .DO     W_10MB
25D5 D6 25 71    2010766                 Call    Div3_38         ;return with !r0:2 = result
25D8               10767                                         ;            ScrReg4:6 = remainder
25D8               10768                 .FIN
25D8   --SKIP--    10769                 .DO     W_20MB + W_40MB
25D8   --SKIP--    10770                 Call    Div3_76         ;return with !r0:2 = result
25D8   --SKIP--    10771                                         ;            ScrReg4:6 = remainder
25D8               10772                 .FIN
25D8               10773                 
25D8 08 E1        610774                 Ld      !r0,!r1 ;HiCyl := ..
25DA 18 E2        610775                 Ld      !r1,!r2 ;LoCyl := ..
25DC 38 46        610776                 Ld      !r3,ScrReg6 ;Remainder := ..
25DE 8D 04 F8      10777                 Jp      Bank_Ret
25E1               10778                 
25E1               10779                 .LSTOFF
25E1               10781                 .LSTON





















        WIDGET.ASSEM            Page 339
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


25E1               10782                 .Page
25E1               10783 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
25E1               10784 ;>
25E1               10785 ;>      Function: DivSctrs  { Divide by Sectors }
25E1               10786 ;>
25E1               10787 ;>      This function takes the 1 byte word passed to it and returns
25E1               10788 ;>      a 1 byte integer ( representing the head number ) and
25E1               10789 ;>      the remainder from the divide ( the remainder is the sector # )..
25E1               10790 ;>
25E1               10791 ;>      Inputs:
25E1               10792 ;>              A : 1 BYTE { !r3 }
25E1               10793 ;>
25E1               10794 ;>      Outputs:
25E1               10795 ;>              Quotient : 1 BYTE { !r2 }
25E1               10796 ;>              Remainder : 1 BYTE { !r3 }
25E1               10797 ;>
25E1               10798 ;>      Algorithm:
25E1               10799 ;>
25E1               10800 ;>              Note that there are only 2 heads on the widget, therefore
25E1               10801 ;>              if A > NumberOfSectors then Head := 1, else Head := 0
25E1               10802 ;>          and if A > NumberOfSectors then Sector := A - NumberOfSectors
25E1               10803 ;>                      else Sector := A
25E1               10804 ;>              Also, the sector is logically remapped to account for 
25E1               10805 ;>              different inteaved drives. The mapping table is located
25E1               10806 ;>              in the SpareTable: when the physical sector is found it's
25E1               10807 ;>              value is used as an index into the Map-Table and the value
25E1               10808 ;>              stored at that location of the table becomes the new sector.
25E1               10809 ;>
25E1               10810 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
25E1               10811                 .LSTOFF
25E1               10814                 .LSTON




























        WIDGET.ASSEM            Page 340
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


25E1               10815                 .Page
25E1               10816                 .FIN
25E1               10817                 
25E1               10818 DivSctrs:
25E1 0C 13        610819                 Ld      !r0,#NbrSctrs   ;load number of sectors into !r0
25E3               10820                 
25E3 A2 30        610821                 Cp      !r3,!r0         ;check for A greater/equal
25E5 1B 06         10822                 Jr      Lt,D_Sctrs1
25E7               10823                 
25E7 2C 01        610824                 Ld      !r2,#1          ;select head 1
25E9 22 30        610825                 Sub     !r3,!r0
25EB 8B 02         10826                 Jr      D_Sctrs2
25ED               10827                 
25ED B0 E2        610828 D_Sctrs1:       Clr     !r2             ;select head 0
25EF               10829                 
25EF AF          1410830 D_Sctrs2:       Ret
25F0               10831 
25F0               10832 
25F0 70 EE         10833 ReMap_Sector:   Push    !rE ;save regs
25F2 70 EF         10834                 Push    !rF
25F4 EC 16        610835                 Ld      !rE,#.HIBYTE. Map_Table
25F6 FC 81        610836                 Ld      !rF,#.LOWBYTE. Map_Table
25F8 02 F0        610837                 Add     !rF,!r0 ;index into table
25FA 16 EE 00    1010838                 Adc     !rE,#0
25FD 82 0E       1210839                 Lde     !r0,@!!rE ;get remapped sector
25FF 50 EF       1010840                 Pop     !rF
2601 50 EE       1010841                 Pop     !rE
2603               10842                 
2603 8D 04 F8      10843                 Jp      Bank_Ret
2606               10844                 
2606               10845                 .LSTOFF
2606               10850                 .LSTON



























        WIDGET.ASSEM            Page 341
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2606               10851                 .Page
2606               10852 ;>>>>>>>>>>>>>>>>>>>>>>>>
2606               10853 ;>
2606               10854 ;>      Module: Servo
2606               10855 ;>
2606               10856 ;>      This module contains all the specifications and source code for 
2606               10857 ;>      controlling the Widget Servo Board ( i.e., communication
2606               10858 ;>      protocol, seek and head positioning, spare table lookup, etc. )
2606               10859 ;>
2606               10860 ;>>>>>>>>>>>>>>>>>>>>>>>>
2606               10861                 .LSTOFF
2606               10864                 .LSTON















































        WIDGET.ASSEM            Page 342
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2606               10865                 .Page
2606               10866 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2606               10867 ;>
2606               10868 ;>      Function: OverLap       { OverLapped Seek }
2606               10869 ;>
2606               10870 ;>      This function allows the drive to begin a seek operation
2606               10871 ;>      ( if one is needed ) before getting tied up with the SOS
2606               10872 ;>      driver.
2606               10873 ;>
2606               10874 ;>      Inputs:
2606               10875 ;>              BlockNumber : 3 BYTES { !rC:E }
2606               10876 ;>
2606               10877 ;>      Outputs: none
2606               10878 ;>
2606               10879 ;>      Algorithm:
2606               10880 ;>
2606               10881 ;>      BEGIN
2606               10882 ;>       IF ( Srch_Cache( BlockNumber ) )
2606               10883 ;>        THEN
2606               10884 ;>         IF ( Srch_Cache.Head <> Head )
2606               10885 ;>          THEN SelectHead( Srch_Cache.Head )
2606               10886 ;>        ELSE
2606               10887 ;>         PositionHeads( NoWait, CnvrtLogical( BlockNumber ) )
2606               10888 ;>         Load_Cache
2606               10889 ;>         BlkStat := CachStat[ 0 ]
2606               10890 ;>         Seek( CnvrtLogical( BlockNumber ) )
2606               10891 ;>      END
2606               10892 ;>
2606               10893 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2606               10894                 .LSTOFF
2606               10897                 .LSTON




























        WIDGET.ASSEM            Page 343
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2606               10898                 .Page
2606               10899                 .FIN
2606               10900 
2606               10901 OverLap:
2606 2C 10        610902                  Ld     !r2,#.HIBYTE. SC_Vector
2608 3C 88        610903                  Ld     !r3,#.LOWBYTE. SC_Vector
260A D6 04 AB    2010904                 Call    Bank_Call
260D EB 1E         10905                 Jr      Nz,OvrLapSeek
260F               10906                 
260F 70 E0         10907                 Push    !r0 ;save Head/Sector info
2611 76 5A 40    1010908                 Tm      BlkStat,#CachHdChg ;check for a head change
2614 6B 0E         10909                 Jr      Z,Ovr_Ld_Sctr
2616               10910                 
2616 B6 54 01    1010911                 Xor     Head,#01 ;complement the head value
2619 E8 54        610912                  Ld     !rE,Head
261B D6 27 38    2010913                 Call    SelectHead
261E               10914                 
261E D6 2B 45    2010915 Ovr_LdCache:    Call    Load_Cache ;update the cache
2621 D6 27 EA    2010916                 Call    Chk_Offset
2624               10917                 
2624 50 E3       1010918 Ovr_Ld_Sctr:    Pop     !r3 ;get Head/Sector infor from stack
2626 56 E3 1F    1010919                 And     !r3,#$1F ;mask off all but sector info
2629 39 55        610920                 Ld      Sector,!r3
262B 8B 20         10921                 Jr      OvrLp_End
262D               10922                 
262D 2C 16        610923 OvrLapSeek:      Ld     !r2,#.HIBYTE. CnvrtLogical
262F 3C 46        610924                  Ld     !r3,#.LOWBYTE. CnvrtLogical
2631 D6 04 AB    2010925                 Call    Bank_Call
2634               10926 
2634 B0 E8        610927 OvrLp_Lp:        Clr    !r8 ;no wait
2636 D6 26 D9    2010928                 Call    PosHeads
2639               10929                 
2639 D6 22 1B    2010930 OvrLp_2:        Call    Ext_Push
263C D6 2B 45    2010931                 Call    Load_Cache ;update the cache
263F               10932                  
263F 2C 16        610933                  Ld     !r2,#.HIBYTE. CachStat
2641 3C E8        610934                  Ld     !r3,#.LOWBYTE. CachStat
2643 82 02       1210935                  Lde    !r0,@!!r2
2645 09 5A        610936                  Ld     BlkStat,!r0
2647               10937                  
2647 D6 22 3C    2010938 OvrLp_S_1:      Call    Ext_Pop
264A D6 05 D7    2010939                 Call    New_Seek
264D               10940 
264D 8D 04 F8      10941 OvrLp_End:      Jp      Bank_Ret
2650               10942 
2650               10943                 .LSTOFF
2650               10948                 .LSTON












        WIDGET.ASSEM            Page 344
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2650               10949                 .Page
2650               10950 ;>>>>>>>>>>>>>>>>>>>>>>>>
2650               10951 ;>
2650               10952 ;>      Module: Srvo1.b1
2650               10953 ;>
2650               10954 ;>      This module contains all the specifications and source code for 
2650               10955 ;>      controlling the Widget Servo Board ( i.e., communication
2650               10956 ;>      protocol, seek and head positioning, spare table lookup, etc. )
2650               10957 ;>
2650               10958 ;>      PROCEDURE Seek( Cylinder : WORD { !!rC }
2650               10959 ;>                      Head : BYTE { !rE }
2650               10960 ;>                      Sector : BYTE { !rF }
2650               10961 ;>                    )
2650               10962 ;>      FUNCTION PosHeads( Wait : BOOLEAN { !r8/bit 6 }
2650               10963 ;>                         Parent : BYTE { !rB }
2650               10964 ;>                         Cylinder : WORD { !!rC }
2650               10965 ;>                         Head : BYTE { !rE }
2650               10966 ;>                         Sector : BYTE { !rF }
2650               10967 ;>                       ) : BOOLEAN
2650               10968 ;>      FUNCTION CalcMagDir( Cylinder : WORD { !!rC } ) :
2650               10969 ;>                         BOOLEAN
2650               10970 ;>                         Magnitude : WORD { !r5 }
2650               10971 ;>                         Direction : BYTE { !r9 }
2650               10972 ;>      FUNCTION ServoOk : BOOLEAN
2650               10973 ;>                         RecalMagDir : BYTE { !r0 }
2650               10974 ;>      PROCEDURE SelectHead( Head : BYTE { !rE }
2650               10975 ;>      PROCEDURE Auto_Offset
2650               10976 ;>
2650               10977 ;>>>>>>>>>>>>>>>>>>>>>>>>
2650               10978                 .LSTOFF
2650               10981                 .LSTON




























        WIDGET.ASSEM            Page 345
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2650               10982                 .Page
2650               10983 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2650               10984 ;>
2650               10985 ;>      Procedure: Seek
2650               10986 ;>
2650               10987 ;>      This procedure accepts cylinder, head, and sector values
2650               10988 ;>      and then calls position heads.
2650               10989 ;>
2650               10990 ;>      Inputs:
2650               10991 ;>              Cylinder: WORD { !!rC }
2650               10992 ;>              Head    : BYTE { !rE }
2650               10993 ;>              Sector  : BYTE { !rF }
2650               10994 ;>
2650               10995 ;>      Outputs: { none }
2650               10996 ;>
2650               10997 ;>      Global Varibles Changed:
2650               10998 ;>              Cylinder, Head, Sector
2650               10999 ;>
2650               11000 ;>      Algorithm:
2650               11001 ;>
2650               11002 ;>      BEGIN
2650               11003 ;>       LastSeekAddress := CurrentSeekAddress
2650               11004 ;>       DiskStat.Parked := False
2650               11005 ;>       IF DiskStat.SeekComplete
2650               11006 ;>        THEN
2650               11007 ;>             i := 4
2650               11008 ;>             WHILE ( i >       0 ) AND NOT( PositionHeads( Wait,
2650               11009 ;>                                      Dmt_Seek, Cylinder, Head, Sector ) DO
2650               11010 ;>
2650               11011 ;>              IF NOT( Recovery ) THEN Abort
2650               11012 ;>              i := i -1
2650               11013 ;>      
2650               11014 ;>             IF ( i = 0 )
2650               11015 ;>              THEN Abort
2650               11016 ;>         ELSE Wait up to 1 sec for ServoReady, if timeout Abort
2650               11017 ;>        LastCylinder := GlobalCylinder
2650               11018 ;>        LastHead     := GlobalHead
2650               11019 ;>        LastSector   := GlobalSector
2650               11020 ;>        GlobalCylinder := Cylinder
2650               11021 ;>        GlobalHead     := Head
2650               11022 ;>        GlobalSector   := Sector
2650               11023 ;>        SectorCount := SectorCount + 1
2650               11024 ;>        DiskStat.SeekComplete := True
2650               11025 ;>        DiskStat.OnTrack := True
2650               11026 ;>      END
2650               11027 ;>
2650               11028 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2650               11029                 .LSTOFF
2650               11032                 .LSTON










        WIDGET.ASSEM            Page 346
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2650               11033                 .Page
2650               11034                 .FIN
2650               11035 
2650               11036 Seek:
2650 D6 22 1B    2011037                 Call    Ext_Push
2653               11038                 
2653 E4 52 5C    1011039                 Ld      Lst_HiCyl,Cylinder ;save last seek address
2656 E4 53 5D    1011040                 Ld      Lst_LoCyl,Cylinder+1
2659 E4 54 5E    1011041                 Ld      Lst_Head,Head
265C E4 55 5F    1011042                 Ld      Lst_Sector,Sector
265F 56 56 EF    1011043                 And     DiskStat,#$FF-Parked
2662               11044                 
2662 76 56 02    1011045                 Tm      DiskStat,#SeekComplete ;check for head/arm motion
2665 6B 2B         11046                 Jr      Z,Seek_Wait
2667               11047                 
2667 1C 04        611048 Seek_ReTry:     Ld      !r1,#4
2669               11049                 
2669 8C 40        611050 Seek_Lp:         Ld     !r8,#Wait
266B D6 26 D9    2011051                 Call    PosHeads
266E EB 27         11052                 Jr      Nz,Seek_End
2670               11053                 
2670 56 56 FE    1011054                 And     DiskStat,#$FF-Offset_On ;remove any offsets
2673 E6 57 90    1011055                 Ld      SeekType,#Access_Offset ;all reseek are with offset
2676               11056                 
2676 76 24 80    1011057                 Tm      Excpt_Stat,#Recovery
2679 6B 0D         11058                 Jr      Z,Seek_Abt
267B               11059                 
267B 70 E1         11060                 Push    !r1 ;save counter
267D 2C 00        611061                  Ld     !r2,#.HIBYTE. 20 ;wait 200 ms before retrying
267F 3C 14        611062                  Ld     !r3,#.LOWBYTE. 20
2681 D6 01 CB    2011063                 Call    MsWait
2684 50 E1       1011064                 Pop     !r1 ;get counter back
2686               11065                 
2686 1A E1         11066                 Djnz    !r1,Seek_Lp
2688               11067                 
2688 0C 00        611068 Seek_Abt:        Ld     !r0,#0 ;byte 0
268A 1C 02        611069                  Ld     !r1,#Stat_Srvo
268C D6 04 03    2011070                 Call    SetStatus
268F D6 05 1F    2011071                 Call    Abort
2692               11072                 
2692 D6 26 B9    2011073 Seek_Wait:      Call    Wait_For_Rdy
2695 6B D2         11074                 Jr      Z,Seek_Lp
2697               11075 
2697 46 56 82    1011076 Seek_End:       Or      DiskStatus,#On_Track+Seek_Complete
269A C9 52        611077                 Ld      Cylinder,!rC
269C D9 53        611078                 Ld      Cylinder+1,!rD
269E F9 55        611079                 Ld      Sector,!rF
26A0 A0 2A       1011080                 Incw    SeekCount
26A2               11081                 
26A2 B4 5C EC    1011082                 Xor     !rC,Lst_HiCyl
26A5 B4 5D ED    1011083                 Xor     !rD,Lst_LoCyl
26A8 42 CD        611084                 Or      !rC,!rD
26AA EB 07         11085                 Jr      Nz,Seek_Ret
26AC               11086                 





        WIDGET.ASSEM            Page 347
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


26AC 80 2A       1011087                 Decw    SeekCount ;account for zero track seek
26AE               11088                 
26AE D6 27 EA    2011089                 Call    Chk_Offset
26B1 6B B6         11090                 Jr      Z,Seek_Lp
26B3               11091                 
26B3 D6 22 3C    2011092 Seek_Ret:       Call    Ext_Pop
26B6               11093                 
26B6 8D 04 F8      11094                 Jp      Bank_Ret
26B9               11095 
26B9               11096 ;*******************************
26B9               11097 
26B9 70 E1         11098 Wait_For_Rdy:   Push    !r1
26BB 1C 64        611099                 Ld      !r1,#100 ;wait for up to a second
26BD 56 FA DF    1011100 Seek_Wt:        And     Irq,#$FF-Timer1 ;clear old timer interrupts
26C0               11101 
26C0 76 02 40    1011102 Seek_Wt_Lp:     Tm      Port2,#SioRdy ;wait for the servo to come back
26C3 6B 08         11103                 Jr      Z,WtRdy_Tmr
26C5               11104                 
26C5 D6 03 FC    2011105                 Call    Load_Status ;check for ServoReady
26C8 76 E0 20    1011106                 Tm      !r0,#ServoRdy
26CB EB 09         11107                 Jr      Nz,WtRdy_End
26CD               11108 
26CD 76 FA 20    1011109 WtRdy_Tmr:      Tm      Irq,#Timer1 ;check for timer interrupt
26D0 6B EE         11110                 Jr      Z,Seek_Wt_Lp
26D2 00 E1        611111                 Dec     !r1
26D4 EB E7         11112                 Jr      Nz,Seek_Wt
26D6               11113                 
26D6 50 E1       1011114 WtRdy_End:      Pop     !r1
26D8 AF          1411115                 Ret
26D9               11116 
26D9               11117                 .LSTOFF
26D9               11119                 .LSTON



























        WIDGET.ASSEM            Page 348
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


26D9               11120                 .Page
26D9               11121 ;>>>>>>>>>>>>>>>>>>>>>>>>
26D9               11122 ;>
26D9               11123 ;>      Function: PosHeads  { Position Heads }
26D9               11124 ;>
26D9               11125 ;>      This function is responsible for positioning the heads of
26D9               11126 ;>      the drive; by supplying the cylinder and head value of
26D9               11127 ;>      the desired track. PosHeads can be used in one of two modes:
26D9               11128 ;>      1) as an overlapped function where the heads can be in motion
26D9               11129 ;>      while the functions returns back to the user or 2) the function
26D9               11130 ;>      will wait for the heads to settle before returning to the caller.
26D9               11131 ;>
26D9               11132 ;>      Inputs:
26D9               11133 ;>              Wait        : BOOLEAN { !r8/bit 6 }
26D9               11134 ;>              Cylinder    : WORD { !!rC }
26D9               11135 ;>              Head        : BYTE { !rE }
26D9               11136 ;>
26D9               11137 ;>      Outputs:
26D9               11138 ;>              PositionHeads : BOOLEAN { zero flag is set if servo err }
26D9               11139 ;>
26D9               11140 ;>      Global Variables Changed: Head, Cur_Cyl
26D9               11141 ;>
26D9               11142 ;>      Algorithm:
26D9               11143 ;>
26D9               11144 ;>      BEGIN
26D9               11145 ;>       DiskStat.Offset_On := False
26D9               11146 ;>       SelectHead( Head )
26D9               11147 ;>       IF ServoOk
26D9               11148 ;>        THEN
26D9               11149 ;>         CalcMagnitudeDirection( Cylinder, Magnitude, Direction )
26D9               11150 ;>         DiskStat.SeekComplete := False
26D9               11151 ;>         DiskStat.On_Track := False
26D9               11152 ;>         SetDeadManTimer
26D9               11153 ;>         ServorStore( SeekType+Direction+
26D9               11154 ;>                      Magnitude[ 1 ], Magnitude[ 2 ],
26D9               11155 ;>                      AutoOffset, 0 )
26D9               11156 ;>         ClearDeadManTimer
26D9               11157 ;>         Cur_Cyl := LocalCylinder
26D9               11158 ;>         IF ( SeekType = Access_Offset ) THEN DiskStat.Offset_On := True
26D9               11159 ;>       PositionHeads := NOT( LoadStatus.ServoErr )
26D9               11160 ;>      END
26D9               11161 ;>
26D9               11162 ;>>>>>>>>>>>>>>>>>>>>>>>>
26D9               11163                 .LSTOFF
26D9               11166                 .LSTON














        WIDGET.ASSEM            Page 349
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


26D9               11167                 .Page
26D9               11168                 .FIN
26D9               11169 
26D9               11170 PosHeads:
26D9 D6 22 1B    2011171                 Call    Ext_Push ;save callers variables
26DC               11172                 
26DC D6 27 38    2011173                 Call    SelectHead
26DF               11174                 
26DF D6 27 8E    2011175 PosHds_Rpt:     Call    ServoOk ;test if Servo is in a reasonable state
26E2 6B 48         11176                 Jr      Z,PosHds_6 ;leave if servo can't be made useable
26E4               11177                 
26E4 D6 27 4A    2011178                 Call    CalcMagDir
26E7               11179                 
26E7 56 56 7D    1011180 PosHds_While:   And    DiskStatus,#$FF-SeekComplete-On_Track
26EA D6 04 13    2011181                 Call    Set_Dmt
26ED 31 40        611182                  Srp    #Wrk_Scr
26EF 08 57        611183                  Ld     !r0,Seek_Type
26F1 44 19 E0    1011184                  Or     !r0,Wrk_Sys+$09 ; Plus Direction
26F4 44 15 E0    1011185                  Or     !r0,Wrk_Sys+$05 ; Plus Ms Magnitude
26F7 18 16        611186                  Ld     !r1,Wrk_Sys+$06 ; Ls Magnitude
26F9 2C 40        611187                  Ld     !r2,#Off_Auto
26FB 3C 80        611188                  Ld     !r3,#S_Rate_57_6
26FD 31 10        611189                  Srp    #Wrk_Sys
26FF D6 27 F8    2011190                 Call    ServoCmnd
2702 8F           611191                 Di                      ;Clear Dead_Man_Timer
2703               11192                 
2703 A6 57 90    1011193                 Cp      SeekType,#Access_Offset ;check for auto_offset
2706 EB 03         11194                 Jr      Nz,PosHds_4
2708               11195                 
2708 46 56 01    1011196                 Or      DiskStat,#Offset_On
270B               11197                 
270B EC 61        611198 PosHds_4:       Ld      !rE,#.HIBYTE. 25000 ;intermidiate timer of 1sec
270D FC A8        611199                 Ld      !rF,#.LOWBYTE. 25000
270F D6 03 FC    2011200 PosHds_42:      Call    LoadStatus      ;sample ServoError
2712 76 E0 10    1011201                 Tm      !r0,#ServoErr
2715 EB 11         11202                 Jr      Nz,PosHds_5      ;if servo error then exit
2717               11203                 
2717 76 E8 40    1011204 PosHds_3:       Tm      !r8,#Wait       ;IF Wait AND NOT( ServoRdy )
271A 6B 0C         11205                 Jr      Z,PosHds_5
271C               11206                 
271C 80 EE       1011207                 Decw    !!rE
271E 6B 08         11208                 Jr      Z,PosHds_5
2720               11209                 
2720 76 E0 20    1011210                 Tm      !r0,#ServoRdy   ; THEN loop until timeout OR ServoRdy
2723 6B EA         11211                 Jr      Z,PosHds_42
2725               11212 
2725 46 56 02    1011213                 Or      DiskStat,#SeekComplete
2728               11214 
2728 C9 50        611215 PosHds_5:       Ld      Cur_Cyl,!rC
272A D9 51        611216                 Ld      Cur_Cyl+1,!rD
272C               11217 
272C D6 22 3C    2011218 PosHds_6:       Call    Ext_Pop ;get caller's variables back
272F D6 03 FC    2011219                 Call    LoadStatus
2732 66 E0 10    1011220                 Tcm     !r0,#ServoErr   ;return Z = true if servo error





        WIDGET.ASSEM            Page 350
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2735 8D 04 F8      11221                 Jp      Bank_Ret
2738               11222                 
2738               11223                 .LSTOFF
2738               11225                 .LSTON























































        WIDGET.ASSEM            Page 351
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2738               11226                 .Page
2738               11227 ;>>>>>>>>>>>>>>>>>>>>>>>>
2738               11228 ;>
2738               11229 ;>      Procedure: SelectHead
2738               11230 ;>
2738               11231 ;>      This procedure is responsible for selecting the correct head
2738               11232 ;>      on the disk.
2738               11233 ;>
2738               11234 ;>      Inputs:
2738               11235 ;>              Head : BYTE { !rE }
2738               11236 ;>
2738               11237 ;>      Outputs: { none }
2738               11238 ;>
2738               11239 ;>>>>>>>>>>>>>>>>>>>>>>>>
2738               11240                 .LSTOFF
2738               11243                 .LSTON











































        WIDGET.ASSEM            Page 352
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2738               11244                 .Page
2738               11245                 .FIN
2738               11246 
2738 42 EE        611247 SelectHead:     Or      !rE,!rE ;test for Head0 or Head1
273A 6B 05         11248                 Jr      Z,Sel_Head0
273C 46 03 20    1011249                 Or      Port3,#Hs0       ;select head 1
273F 8B 03         11250                 Jr      SelHd_End
2741               11251         
2741 56 03 DF    1011252 Sel_Head0:      And     Port3,#$FF-Hs0   ;select head 0
2744 E9 54        611253 SelHd_End:      Ld      Head,!rE
2746               11254 
2746 56 56 FE    1011255                 And     DiskStat,#$FF-Offset_On
2749 AF          1411256 SelHd_Ret:      Ret
274A               11257                 
274A               11258                 .LSTOFF
274A               11260                 .LSTON











































        WIDGET.ASSEM            Page 353
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


274A               11261                 .Page
274A               11262 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
274A               11263 ;>
274A               11264 ;>      Function: CalcMagDir  { Calculate Magnitude and Direction }
274A               11265 ;>
274A               11266 ;>      This function takes the current cylinder number ( from the
274A               11267 ;>      conversion of the logical block ) and generates a magnitude
274A               11268 ;>      and direction from the the position that the heads are 
274A               11269 ;>      currently at ( the servo needs to know a RELATIVE distance,
274A               11270 ;>      not an absolute distance ).
274A               11271 ;>
274A               11272 ;>      Inputs:
274A               11273 ;>              LocalCylinder : WORD { !rC, !rD }
274A               11274 ;>
274A               11275 ;>      Outputs:
274A               11276 ;>              CalcMagDir : BOOLEAN { !r4 }
274A               11277 ;>              Magnitude : WORD { !r5, !r6 }
274A               11278 ;>              Direction : BYTE { !r9 }
274A               11279 ;>
274A               11280 ;>      Local Variables :
274A               11281 ;>              Temp : BOOLEAN { }
274A               11282 ;>              GlobalPTR : PTR { !r2, !r3 }
274A               11283 ;>
274A               11284 ;>      Algorithm:
274A               11285 ;>
274A               11286 ;>      BEGIN
274A               11287 ;>       IF LocalCylinder <> GlobalCylinder
274A               11288 ;>        THEN
274A               11289 ;>              IF LocalCylinder > GlobalCylinder
274A               11290 ;>               THEN
274A               11291 ;>                    Direction := Positive
274A               11292 ;>                    Magnitude := LocalCylinder - GlobalCylinder
274A               11293 ;>               ELSE
274A               11294 ;>                    Direction := Negative
274A               11295 ;>                    Magnitude := GlobalCylinder - LocalCylinder
274A               11296 ;>              Temp := True
274A               11297 ;>        ELSE
274A               11298 ;>              Temp := False
274A               11299 ;>       CalcMagDir := Temp
274A               11300 ;>      END
274A               11301 ;>
274A               11302 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
274A               11303                 .LSTOFF
274A               11306                 .LSTON















        WIDGET.ASSEM            Page 354
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


274A               11307                 .Page
274A               11308                 .FIN
274A               11309 
274A               11310 CalcMagDir:
274A 70 EE         11311                 Push    !rE     ;save !rE
274C               11312                  
274C E8 ED        611313                  Ld      !rE,!rD ;move cylinder down one byte to use Sub3
274E D8 EC        611314                  Ld      !rD,!rC
2750 B0 EC        611315                  Clr     !rC
2752               11316                 
2752 18 50        611317                  Ld     !r1,Cur_Cyl
2754 28 51        611318                  Ld     !r2,Cur_Cyl+1
2756 B0 E0        611319                  Clr    !r0
2758 D6 03 A5    2011320                 Call    Sub3    ;get Cylinder - CurrentCylinder
275B               11321                 
275B C8 ED        611322                 Ld      !rC,!rD ;replace cylinder variable
275D D8 EE        611323                 Ld      !rD,!rE
275F 50 EE       1011324                 Pop     !rE     ;replace Head
2761 B0 E4        611325                 Clr     !r4     ;assume no seek needed
2763               11326                 
2763 1B 12         11327                 Jr      Lt,C_MagDir_Else
2765               11328                 
2765 B0 E5        611329                 Clr     !r5     ;assume 0 track seek
2767 B0 E6        611330                 Clr     !r6
2769 9C 00        611331                 Ld      !r9,#0 ;set direction negative
276B               11332                 
276B B0 E3        611333                 Clr     !r3     ;check for no seek condition
276D 42 32        611334                 Or      !r3,!r2
276F 42 31        611335                 Or      !r3,!r1
2771 42 30        611336                 Or      !r3,!r0
2773 6B 14         11337                 Jr      Z,C_MagDir_Ret
2775 8B 0C         11338                 Jr      S_Glbl_Cyl
2777               11339                 
2777 60 E2        611340 C_MagDir_Else:  Com     !r2     ;2's complement sutraction result
2779 60 E1        611341                 Com     !r1
277B 06 E2 01    1011342                 Add     !r2,#1
277E 16 E1 00    1011343                 Adc     !r1,#0
2781               11344                 
2781 9C 04        611345                 Ld      !r9,#Hd_Dir_Frwd     ;set direction positive
2783               11346                 
2783 58 E1        611347 S_Glbl_Cyl:     Ld      !r5,!r1 ;load magnitude
2785 68 E2        611348                 Ld      !r6,!r2
2787               11349                 
2787 4C 01        611350                 Ld      !r4,#01 ;set Seek
2789 42 44        611351 C_MagDir_Ret:   Or      !r4,!r4 ;set SeekNeeded flag
278B 8D 04 F8      11352                 Jp      Bank_Ret
278E               11353 
278E               11354                 .LSTOFF
278E               11356                 .LSTON










        WIDGET.ASSEM            Page 355
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


278E               11357                 .Page
278E               11358 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
278E               11359 ;>
278E               11360 ;>      Function: ServoOk
278E               11361 ;>
278E               11362 ;>      This function is responsible for determining if the
278E               11363 ;>      servo is in a reasonable state to perform commands. In 
278E               11364 ;>      other words if ServoReady and NOT( ServoError ) then
278E               11365 ;>      the servo is healthy, wealthy and wise. If, on the other
278E               11366 ;>      hand, ServoError is active then the state of ServoReady
278E               11367 ;>      determines the type of action to perform to try to get
278E               11368 ;>      the servo back to a nice state:
278E               11369 ;>
278E               11370 ;>      ServoError and ServoReady: Read Status
278E               11371 ;>      ServorError and Not( ServoReady ): Data Recal
278E               11372 ;>
278E               11373 ;>      Inputs: { none }
278E               11374 ;>
278E               11375 ;>      Outputs:
278E               11376 ;>              ServOk: BOOLEAN { Zero Flag, True if NOT( ServoOk ) }
278E               11377 ;>              RecalcMagDir: BYTE { !r0 }
278E               11378 ;>
278E               11379 ;>      Local Variables:
278E               11380 ;>              Retry   : BYTE { !rF }
278E               11381 ;>              SioRetry: BYTE { !r8 }
278E               11382 ;>              Done    : BOOLEAN { }
278E               11383 ;>              ControllerStatusPTR : PTR { !!rC }
278E               11384 ;>
278E               11385 ;>      Algorithm:
278E               11386 ;>
278E               11387 ;>      BEGIN
278E               11388 ;>       RecalcMagDir := False
278E               11389 ;>       IF Recovery AND ServoError
278E               11390 ;>        THEN
278E               11391 ;>              Retry := 4
278E               11392 ;>              WHILE ( Retry > 0 ) AND ServoError DO
278E               11393 ;>                 IF ServoReady
278E               11394 ;>                  THEN ServoStatus( ReadStatus, x
278E               11395 ;>                                           x, NormalServoStatus )
278E               11396 ;>                  ELSE ServoCmnd( DataRecal, x, x, x )
278E               11397 ;>                 Retry := Retry - 1
278E               11398 ;>       IF NOT( On_Track ) THEN RecalcMagDir := True
278E               11399 ;>       ServoOk := NOT( ServoError )
278E               11400 ;>      END
278E               11401 ;>
278E               11402 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
278E               11403                 .LSTOFF
278E               11406                 .LSTON











        WIDGET.ASSEM            Page 356
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


278E               11407                 .Page
278E               11408                 .FIN
278E               11409 
278E               11410 ServoOk:
278E 76 24 80    1011411                 Tm      Excpt_Status,#Recovery         ;IF Recovery
2791 6B 25         11412                 Jr      Z,S_Ok_End
2793               11413                 
2793 D6 03 FC    2011414                 Call    LoadStatus
2796               11415                 
2796 76 E0 10    1011416                 Tm      !r0,#ServoErr ;IF ServoError
2799 6B 0D         11417                 Jr      Z,SOk_ChkRdy
279B               11418                 
279B D6 27 C1    2011419 SOk_Err:        Call    Chk_MvWrData    ;save write data if Write_Op
279E 0C 40        611420                  Ld     !r0,#DataRecal ;IF ServoErr AND NOT( ServoRdy )
27A0 D6 28 A0    2011421                 Call    Restore        ; THEN Restore
27A3 D6 20 6B    2011422                 Call    Buf2_To_WrBuf   ;assume write_op
27A6 8B 10         11423                 Jr      S_Ok_End
27A8               11424 
27A8 76 E0 20    1011425 SOk_ChkRdy:     Tm      !r0,#ServoRdy ;IF NOT( ServoErr )
27AB EB 0B         11426                 Jr      Nz,S_Ok_End   ; AND ServoRdy
27AD               11427                 
27AD D6 27 C1    2011428 SOk_Park:       Call    Chk_MvWrData    ;save write data if Write_Op
27B0 D6 28 32    2011429                 Call    S_Reset       ;OtherWise unpark the servo
27B3 D6 20 6B    2011430                 Call    Buf2_To_WrBuf   ;assume write_op
27B6 8B 00         11431                 Jr      S_Ok_End
27B8               11432 
27B8 D6 03 FC    2011433 S_Ok_End:       Call    LoadStatus
27BB 66 E0 10    1011434                 Tcm     !r0,#ServoErr   ;return z = true if servo error
27BE 8D 04 F8      11435                 Jp      Bank_Ret
27C1               11436                 
27C1               11437 ;********************
27C1               11438 
27C1 76 56 20    1011439 Chk_MvWrData:   Tm      DiskStat,#Wr_Op ;check for write_op
27C4 6B 03         11440                 Jr      Z,MvWr_End
27C6               11441                 
27C6 D6 20 65    2011442                 Call    WrBuf_To_Buf2
27C9 AF          1411443 MvWr_End:       Ret
27CA               11444                 
27CA               11445                 .LSTOFF
27CA               11447                 .LSTON



















        WIDGET.ASSEM            Page 357
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


27CA               11448                 .Page
27CA               11449 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
27CA               11450 ;>
27CA               11451 ;>      Procedure: Auto_Offset
27CA               11452 ;>
27CA               11453 ;>      This procedure is used to set auto_offset to the servo processor.
27CA               11454 ;>
27CA               11455 ;>      Inputs: { none }
27CA               11456 ;>
27CA               11457 ;>      Outputs: { none }
27CA               11458 ;>
27CA               11459 ;>      Algorithm:
27CA               11460 ;>
27CA               11461 ;>      BEGIN
27CA               11462 ;>       ServoCmnd( Offset, 0, Off_Auto, S_Rate_57_6 )
27CA               11463 ;>      END
27CA               11464 ;>
27CA               11465 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
27CA               11466                 .LSTOFF
27CA               11469                 .LSTON







































        WIDGET.ASSEM            Page 358
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


27CA               11470                 .Page
27CA               11471                 .FIN
27CA               11472 
27CA               11473 Auto_Offset:
27CA D6 04 13    2011474                 Call    Set_Dmt ;set deadman timer
27CD               11475                 
27CD 31 40        611476                  Srp    #Wrk_Scr
27CF 0C 90        611477                  Ld     !r0,#Access_Offset
27D1 1C 00        611478                  Ld     !r1,#0
27D3 2C 40        611479                  Ld     !r2,#Off_Auto
27D5 3C 80        611480                  Ld     !r3,#S_Rate_57_6
27D7 31 10        611481                  Srp    #Wrk_Sys
27D9 D6 27 F8    2011482                 Call    ServoCmnd
27DC               11483                 
27DC D6 04 1F    2011484                 Call    Clr_Dmt
27DF D6 26 B9    2011485                 Call    Wait_For_Rdy
27E2 6B 03         11486                 Jr      Z,Auto_Off_Ret
27E4               11487                 
27E4 46 56 01    1011488                 Or      Disk_Stat,#Offset_On
27E7 8D 04 F8      11489 Auto_Off_Ret:   Jp      Bank_Ret
27EA               11490                 
27EA               11491 ;******************
27EA               11492 
27EA A6 57 90    1011493 Chk_Offset:     Cp      Seek_Type,#Access_Offset ;check if auto offset needed
27ED EB 08         11494                 Jr      Nz,Chk_Off_Ret
27EF               11495                 
27EF 76 56 01    1011496 ChkOff_NoOff:   Tm      DiskStat,#Offset_On ;THEN check for offset already on
27F2 EB 03         11497                 Jr      Nz,Chk_Off_Ret
27F4               11498 
27F4 D6 27 CA    2011499                 Call    Auto_Offset ;otherwise Auto_Offset
27F7               11500                 
27F7 AF          1411501 Chk_Off_Ret:    Ret
27F8               11502 
27F8               11503                 .LSTOFF
27F8               11509                 .LSTON
























        WIDGET.ASSEM            Page 359
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


27F8               11510                 .Page
27F8               11511 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
27F8               11512 ;>
27F8               11513 ;>      Module: SrvoUtils
27F8               11514 ;>
27F8               11515 ;>      BANK 1 MODULE
27F8               11516 ;>
27F8               11517 ;>      This module holds those routines that make up most of the
27F8               11518 ;>      auxillary servo commands.
27F8               11519 ;>
27F8               11520 ;>      PROCEDURE ServoCmnd( CommandString : 4 BYTES { !r0:3 } )
27F8               11521 ;>      PROCEDURE ServoStatus( CommandString : 4 BYTES { !r0:3 }
27F8               11522 ;>                             BufferPtr : PTR { !!rE }
27F8               11523 ;>                           )
27F8               11524 ;>      FUNCTION ServoStore : BOOLEAN
27F8               11525 ;>      FUNCTION ServoLoad( BufferPtr : PTR { !!r2 } ) : BOOLEAN
27F8               11526 ;>      FUNCTION Restore( RecalType : BYTE { !r0 } ) : BOOLEAN
27F8               11527 ;>      PROCEDURE SrvoRcvry
27F8               11528 ;>      PROCEDURE Load_SrvoCmnd
27F8               11529 ;>      PROCEDURE Park_Heads
27F8               11530 ;>      PROCEDURE ResetServo
27F8               11531 ;>
27F8               11532 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
27F8               11533                 .LSTOFF
27F8               11536                 .LSTON


































        WIDGET.ASSEM            Page 360
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


27F8               11537                 .Page
27F8               11538 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
27F8               11539 ;>
27F8               11540 ;>      Procedure: ServoCmnd  { Send the Servo a command }
27F8               11541 ;>
27F8               11542 ;>      Inputs:
27F8               11543 ;>              CommandString : 4 BYTES { !r0:3 }
27F8               11544 ;>
27F8               11545 ;>      Outputs: { none }
27F8               11546 ;>
27F8               11547 ;>      Global Variables Changed:
27F8               11548 ;>              SrvoCmndBuffer
27F8               11549 ;>
27F8               11550 ;>      Local Variables:
27F8               11551 ;>              SioRetry : BYTE { !r8 }
27F8               11552 ;>
27F8               11553 ;>      Algorithm:
27F8               11554 ;>
27F8               11555 ;>      BEGIN
27F8               11556 ;>       SrvoCmndBuffer[ CommandByte ] := !r0
27F8               11557 ;>       SrvoCmndBuffer[ LoDiffByte ] := !r1
27F8               11558 ;>       SrvoCmndBuffer[ OffsetByte ] := !r2
27F8               11559 ;>       SrvoCmndBuffer[ StatusByte ] := !r3
27F8               11560 ;>       SioRetry := 4
27F8               11561 ;>       WHILE NOT( ServoStore( CommandString ) ) AND ( SioRetry > 0 ) DO
27F8               11562 ;>              SioRetry := SioRetry - 1
27F8               11563 ;>       IF ( SioRetry = 0 ) ABORT
27F8               11564 ;>      END
27F8               11565 ;>
27F8               11566 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
27F8               11567                 .LSTOFF
27F8               11570                 .LSTON



























        WIDGET.ASSEM            Page 361
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


27F8               11571                 .Page
27F8               11572                 .FIN
27F8               11573                 
27F8               11574 ServoCmnd:      
27F8 31 30        611575                 Srp     #Wrk_Sys2
27FA D6 29 36    2011576                 Call    Load_SrvoCmnd
27FD               11577                 
27FD 8C 04        611578 Srv_C_Lp1:      Ld      !r8,#4  ;SioRetry := 4
27FF               11579                 
27FF 48 40        611580                 Ld      !r4,ScrReg0 ;save command
2801 58 41        611581                 Ld      !r5,ScrReg1
2803 A8 42        611582                 Ld      !rA,ScrReg2
2805 B8 43        611583                 Ld      !rB,ScrReg3
2807               11584                 
2807 D6 28 41    2011585 Srv_C_Lp:       Call    ServoStore
280A EB 0D         11586                 Jr      Nz,Srv_C_End
280C               11587                 
280C 49 40        611588                 Ld      ScrReg0,!r4 ;restore command
280E 59 41        611589                 Ld      ScrReg1,!r5
2810 A9 42        611590                 Ld      ScrReg2,!rA
2812 B9 43        611591                 Ld      ScrReg3,!rB
2814               11592                 
2814 8A F1         11593                 Djnz    !r8,Srv_C_Lp
2816               11594 
2816 D6 05 1F    2011595 Srv_C_Abort:    Call    Abort
2819               11596                 
2819 31 10        611597 Srv_C_End:      Srp     #Wrk_Sys
281B 8D 04 F8      11598                 Jp      Bank_Ret
281E               11599                 
281E               11600                 .LSTOFF
281E               11602                 .LSTON




























        WIDGET.ASSEM            Page 362
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


281E               11603                 .Page
281E               11604 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
281E               11605 ;>
281E               11606 ;>      Procedure: ServoStatus  { Read a status location from the servo }
281E               11607 ;>
281E               11608 ;>      Inputs:
281E               11609 ;>              CommandString : 4 BYTES { !r0:3 }
281E               11610 ;>              BufferPtr     : PTR { !!rE }
281E               11611 ;>
281E               11612 ;>      Outputs: { none }
281E               11613 ;>
281E               11614 ;>      Global Variables Changed:
281E               11615 ;>              SrvoCmndBuffer
281E               11616 ;>              @BufferPtr
281E               11617 ;>
281E               11618 ;>      Local Variables:
281E               11619 ;>              SioRetry : BYTE { !r8 }
281E               11620 ;>
281E               11621 ;>      Algorithm:
281E               11622 ;>
281E               11623 ;>      BEGIN
281E               11624 ;>       ServoCmnd
281E               11625 ;>       IF NOT( ServoLoad( BufferPtr ) ) THEN ABORT
281E               11626 ;>      END
281E               11627 ;>
281E               11628 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
281E               11629                 .LSTOFF
281E               11632                 .LSTON































        WIDGET.ASSEM            Page 363
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


281E               11633                 .Page
281E               11634                 .FIN
281E               11635                 
281E               11636 ServoStatus:
281E 70 E8         11637                 Push    !r8 ;save for caller
2820               11638                 
2820 D6 27 F8    2011639 Srv_St_Lp1:     Call    ServoCmnd
2823 D6 28 7E    2011640 Srv_St_Else:    Call    ServoLoad
2826 6B 05         11641                 Jr      Z,Srv_St_End
2828               11642                 
2828 31 10        611643                 Srp     #Wrk_Sys
282A D6 05 1F    2011644                 Call Abort
282D               11645                 
282D 50 E8       1011646 Srv_St_End:     Pop     !r8
282F 8D 04 F8      11647                 Jp      Bank_Ret
2832               11648                 
2832 D6 22 1B    2011649 S_Reset:        Call    Ext_Push
2835 D6 29 5D    2011650                 Call    ResetServo
2838 D6 22 3C    2011651                 Call    Ext_Pop
283B 0C 40        611652                  Ld     !r0,#DataRecal
283D D6 28 A0    2011653                 Call    Restore
2840 AF          1411654                 Ret
2841               11655                 
2841               11656                 .LSTOFF
2841               11658                 .LSTON


































        WIDGET.ASSEM            Page 364
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2841               11659                 .Page
2841               11660 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2841               11661 ;>
2841               11662 ;>      Function: ServoStore
2841               11663 ;>
2841               11664 ;>      The function of this routine is to transmit a command string
2841               11665 ;>      to the Servo Processor. The command string is expected to
2841               11666 ;>      reside in the global variable
2841               11667 ;>      SrvoCmndBuffer ( thus providing a record of the last command
2841               11668 ;>      sent to the servo ). ServoStore then attempts to complete the
2841               11669 ;>      transmission to the Servo, and returns a boolean variable
2841               11670 ;>      indicating whether the transmission was completed or not.
2841               11671 ;>
2841               11672 ;>      Inputs:
2841               11673 ;>              Parent : BYTE { !r1 }
2841               11674 ;>
2841               11675 ;>      Outputs:
2841               11676 ;>              ServoStore : BOOLEAN { Zero flag; True if transmission failed }
2841               11677 ;>
2841               11678 ;>      Local Variables:
2841               11679 ;>              Retry : BYTE { !r6 }
2841               11680 ;>              i     : BYTE { !r4 }
2841               11681 ;>              j     : BYTE { !r5 }
2841               11682 ;>
2841               11683 ;>      Algorithm:
2841               11684 ;>
2841               11685 ;>      BEGIN
2841               11686 ;>       SrvoCmndBuffer[ CheckByte ] := GenerateCheckByte(
2841               11687 ;>                                              PTR( SrvoCmndBuffer ),
2841               11688 ;>                                              Length( SrvoCmndBuffer ) )
2841               11689 ;>       Retry := 10
2841               11690 ;>       REPEAT
2841               11691 ;>         FOR i := 1 TO 5 DO
2841               11692 ;>              WHILE ( IRQ.SerialOutput = False ) OR NOT( SioReady ) DO
2841               11693 ;>                      BEGIN
2841               11694 ;>                      END
2841               11695 ;>              Sio.Data := SrvoCmndBuffer[ i ]
2841               11696 ;>         Retry := Retry - 1
2841               11697 ;>         FOR j := 1 TO ( value for wait of 250 usec ) DO BEGIN END
2841               11698 ;>       UNTIL NOT( SioReady ) OR ( Retry = 0 )
2841               11699 ;>       FOR j := 1 TO ( value for wait of 400 usec ) DO BEGIN END
2841               11700 ;>       IF ( Retry = 0 )
2841               11701 ;>        THEN ServoStore := False
2841               11702 ;>        ELSE ServoStore := True
2841               11703 ;>
2841               11704 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2841               11705                 .LSTOFF
2841               11708                 .LSTON











        WIDGET.ASSEM            Page 365
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2841               11709                 .Page
2841               11710                 .FIN
2841               11711 
2841 70 FD         11712 ServoStore:     Push    Rp ;save context
2843 31 40        611713                 Srp     #Wrk_Scr
2845               11714                 
2845 EC 14        611715                  Ld     !rE,#.HIBYTE. SrvoCmndBuffer
2847 FC B1        611716                  Ld     !rF,#.LOWBYTE. SrvoCmndBuffer
2849 8C 04        611717                  Ld     !r8,#S_Cmnd_Len - 1
284B D6 06 2E    2011718                 Call    Gen_Chk_Byte
284E               11719                 
284E 6C 0A        611720                 Ld      !r6,#10 ;Retry := 10
2850               11721                 
2850 EC 14        611722 Srvo_St_Rpt:    Ld      !rE,#.HIBYTE. SrvoCmndBuffer
2852 FC B1        611723                 Ld      !rF,#.LOWBYTE. SrvoCmndBuffer
2854               11724                 
2854 4C 05        611725                 Ld      !r4,#S_Cmnd_Len
2856               11726                 
2856 76 02 40    1011727 Srvo_St_1:      Tm      Port2,#SioRdy   ; WHILE NOT( SioReady )
2859 6B FB         11728                 Jr      Z,Srvo_St_1
285B               11729                 
285B 56 FA E7    1011730                 And     Irq,#$FF-Serial_Out-Serial_In     ;clear old interrupts
285E               11731                 
285E 82 0E       1211732                 Lde     !r0,@!!rE       ;get a command byte
2860 09 F0        611733                 Ld      Sio,!r0         ;send it to Servo
2862               11734                 
2862 A0 EE       1011735                 Incw    !rE             ;point to next command byte
2864               11736                 
2864 76 FA 10    1011737 Srvo_St_2:      Tm      Irq,#Serial_Out ;WHILE ( IRQ.SerialOut = False )
2867 6B FB         11738                 Jr      Z,Srvo_St_2
2869               11739                 
2869 4A EB         11740                 Djnz    !r4,Srvo_St_1   ;loop 'til all command bytes are sent
286B               11741                 
286B 56 FA EF    1011742                 And     Irq,#$FF-Serial_Out     ;clear old interrupts
286E               11743                 
286E 5C 50        611744                 Ld      !r5,#80         ;do a 250 usec wait
2870 5A FE         11745 Srvo_Wt_1:      Djnz    !r5,Srvo_Wt_1
2872               11746 
2872 76 02 40    1011747                 Tm      Port2,#SioRdy   ;if NOT( SioReady ) then Servo 
2875 6B 02         11748                 Jr      Z,Srvo_St_Exit  ; took the bytes and is munchin' on 'em
2877               11749                 
2877 6A D7         11750                 Djnz    !r6,Srvo_St_Rpt ;Retry := Retry - 1
2879               11751                 
2879 42 66        611752 Srvo_St_Exit:   Or      !r6,!r6         ;test for Retry = 0
287B 50 FD       1011753                 Pop     Rp ;return to original context
287D AF          1411754                 Ret
287E               11755                 
287E               11756                 .LSTOFF
287E               11758                 .LSTON










        WIDGET.ASSEM            Page 366
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


287E               11759                 .Page
287E               11760 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
287E               11761 ;>
287E               11762 ;>      Function: ServoLoad
287E               11763 ;>
287E               11764 ;>      This function is responsible for reading a status response back 
287E               11765 ;>      from the servo. The bytes that it receives are stored into a
287E               11766 ;>      buffer that is passed into the routine in the form of a PTR.
287E               11767 ;>      ServoLoad passes back to the caller a BOOLEAN variable describing
287E               11768 ;>      whether the checkbyte was valid ( i.e., the transmission was a
287E               11769 ;>      success.
287E               11770 ;>
287E               11771 ;>      Inputs:
287E               11772 ;>              Parent : BYTE { !r1 }
287E               11773 ;>              BufferPtr : PTR { !r2:3 }
287E               11774 ;>
287E               11775 ;>      Outputs:
287E               11776 ;>              ServoLoad : BOOLEAN { Zero flag, true if checkbyte mismatch }
287E               11777 ;>
287E               11778 ;>      Global Variables Changed:
287E               11779 ;>              Buffer pointed to by !!r2
287E               11780 ;>
287E               11781 ;>      Local Variables:
287E               11782 ;>              i : BYTE { !r4 }
287E               11783 ;>              TempBufPtr : PTR { !!rA }
287E               11784 ;>
287E               11785 ;>      Algorithm:
287E               11786 ;>
287E               11787 ;>      BEGIN
287E               11788 ;>       FOR i := 1 TO 5 DO
287E               11789 ;>         WHILE NOT( Irq.SerialInput ) DO BEGIN END
287E               11790 ;>         Buffer[ i ] := Sio.Data
287E               11791 ;>       ServoLoad := Check_Check_Byte( PTR( Buffer ), 5 )
287E               11792 ;>      END
287E               11793 ;>
287E               11794 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
287E               11795                 .LSTOFF
287E               11798                 .LSTON





















        WIDGET.ASSEM            Page 367
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


287E               11799                 .Page
287E               11800                 .FIN
287E               11801 
287E               11802 ServoLoad:
287E 70 FD         11803                 Push    Rp      ;save context
2880 31 40        611804                 Srp     #Wrk_Scr  ;context switch
2882               11805                 
2882 4C 05        611806                 Ld      !r4,#5  ;load i
2884               11807                 
2884 76 FA 08    1011808 Srvo_Ld_Wt:     Tm      Irq,#Serial_In
2887 6B FB         11809                 Jr      Z,Srvo_Ld_Wt
2889               11810                 
2889 56 FA F7    1011811                 And     Irq,#$FF-Serial_In      ;clear old interrupts
288C               11812                 
288C 08 F0        611813                 Ld      !r0,Sio         ;read SIO
288E 92 0E       1211814                 Lde     @!!rE,!r0       ; and store in buffer
2890               11815                 
2890 A0 EE       1011816                 Incw    !!rE            ;point to next location in buffer
2892               11817                 
2892 4A F0         11818                 Djnz    !r4,Srvo_Ld_Wt  ;loop 'til all bytes are read
2894               11819                 
2894 EC 14        611820                  Ld     !rE,#.HIBYTE. SStatus0 ;get original buffer ptr
2896 FC B6        611821                  Ld     !rF,#.LOWBYTE. SStatus0
2898 8C 04        611822                  Ld     !r8,#4          ;length of buffer
289A D6 06 1D    2011823                 Call   Chk_Chk_Byte
289D 50 FD       1011824                 Pop     Rp              ;context switch
289F AF          1411825                 Ret
28A0               11826                 
28A0               11827                 .LSTOFF
28A0               11829                 .LSTON





























        WIDGET.ASSEM            Page 368
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


28A0               11830                 .Page
28A0               11831 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
28A0               11832 ;>
28A0               11833 ;>      Function: Restore
28A0               11834 ;>
28A0               11835 ;>      This procedure performs a Recal operation on the servo.
28A0               11836 ;>      Normally, a ReadHeader operation is to be performed after 
28A0               11837 ;>      the Servo comes ready, and the current cylinder is to be 
28A0               11838 ;>      subsequently updated. This mechanism ( doing the ReadHeader )
28A0               11839 ;>      can be turned off by clearing the RdHdrRecal bit in the
28A0               11840 ;>      exception working register set.
28A0               11841 ;>
28A0               11842 ;>      Inputs:
28A0               11843 ;>              RecalType : BYTE { !r0 }
28A0               11844 ;>
28A0               11845 ;>      Outputs:
28A0               11846 ;>              Restore : BOOLEAN { zero flag is true if NOT( ServoRdy ) }
28A0               11847 ;>
28A0               11848 ;>      Algorithm:
28A0               11849 ;>
28A0               11850 ;>      BEGIN
28A0               11851 ;>       ServoCmnd( RecalType, 0, 0, 57.6K Baud )
28A0               11852 ;>       WHILE NOT( ServoRdy ) AND 2 seconds hasn't gone by DO BEGIN END
28A0               11853 ;>       IF ( DiskStat.RdHdrRecal ) AND ServoRdy
28A0               11854 ;>        THEN IF NOT( UpDate_Cur_Cyl ) THEN Abort
28A0               11855 ;>        ELSE
28A0               11856 ;>         IF ( RecalType = DataRecal )
28A0               11857 ;>          THEN Cur_Cyl := Init_Cyl
28A0               11858 ;>          ELSE Cur_Cyl := Max_Cyl
28A0               11859 ;>       Restore := ServoRdy
28A0               11860 ;>      END
28A0               11861 ;>
28A0               11862 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
28A0               11863                 .LSTOFF
28A0               11866                 .LSTON
























        WIDGET.ASSEM            Page 369
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


28A0               11867                 .Page
28A0               11868                 .FIN
28A0               11869 
28A0               11870 Restore:
28A0 70 E0         11871                  Push   !r0 ;save RecalType for later
28A2 D6 22 1B    2011872                  Call   Ext_Push
28A5               11873                  
28A5 D6 04 13    2011874                  Call   Set_Dmt
28A8               11875                  
28A8 31 40        611876                  Srp    #Wrk_Scr
28AA 50 E0       1011877                  Pop    !r0 ;save RecalType for later
28AC 70 E0         11878                  Push   !r0
28AE B0 E1        611879                  Clr    !r1
28B0 B0 E2        611880                  Clr    !r2
28B2 3C 80        611881                  Ld     !r3,#S_Rate_57_6
28B4 31 10        611882                  Srp    #Wrk_Sys
28B6 D6 27 F8    2011883                 Call    ServoCmnd
28B9 D6 04 1F    2011884                 Call    Clr_Dmt
28BC 56 56 7F    1011885                 And     DiskStat,#$FF-On_Track
28BF D6 29 FD    2011886                 Call    Set_SeekNeeded
28C2               11887                 
28C2 E6 50 02    1011888                 Ld      Cur_Cyl,#HiMaxCyl ;assume FormatRecal
28C5 E6 51 20    1011889                 Ld      Cur_Cyl+1,#LoMaxCyl
28C8               11890                 
28C8 50 E6       1011891                 Pop     !r6 ;load RecalType from storage
28CA A6 E6 70    1011892                 Cp      !r6,#FrmtRecal
28CD 6B 06         11893                 Jr      Z,Rest_Up2
28CF               11894                 
28CF E6 50 01    1011895                 Ld      Cur_Cyl,#Init_HiCyl ;otherwise DataRecal
28D2 E6 51 F9    1011896                 Ld      Cur_Cyl+1,#Init_LoCyl
28D5               11897 
28D5 B0 E5        611898 Rest_Up2:       Clr     !r5
28D7 4C D5        611899                 Ld      !r4,#$D5 ;max time to wait is two seconds
28D9               11900                 
28D9 D6 03 FC    2011901 Restore_Lp:     Call    LoadStatus
28DC 76 E0 20    1011902                 Tm      !r0,#ServoRdy
28DF EB 08         11903                 Jr      Nz,Rest_UpDate
28E1 80 E4       1011904                 Decw    !!r4
28E3 EB F4         11905                 Jr      Nz,Restore_Lp
28E5               11906                 
28E5 B0 E0        611907                 Clr     !r0             ;pass error status to exit
28E7 8B 17         11908                 Jr      Restore_End
28E9               11909                 
28E9 76 56 40    1011910 Rest_UpDate:    Tm      DiskStat,#RdHdrRecal
28EC 6B 10         11911                 Jr      Z,Rest_Up1
28EE A6 E6 70    1011912                 Cp      !r6,#FrmtRecal ;don't try to read headers here!
28F1 6B 0B         11913                 Jr      Z,Rest_Up1
28F3               11914                 
28F3 D6 20 F1    2011915                 Call    UpDate_Cur_Cyl
28F6 EB 06         11916                 Jr      Nz,Rest_Up1 ;leave if positioned correctly
28F8               11917                 
28F8 D6 05 A2    2011918                 Call    SS_NoHdr ;header err here is bad news!
28FB D6 05 1F    2011919                 Call    Abort
28FE               11920 





        WIDGET.ASSEM            Page 370
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


28FE 0C 01        611921 Rest_Up1:       Ld      !r0,#1
2900 70 E0         11922 Restore_End:    Push    !r0 ;save result
2902 D6 22 3C    2011923                 Call    Ext_Pop
2905 50 E0       1011924                 Pop     !r0
2907 42 00        611925                 Or      !r0,!r0 ;set zero flag
2909 8D 04 F8      11926                 Jp      Bank_Ret
290C               11927                 
290C               11928                 .LSTOFF
290C               11930                 .LSTON


















































        WIDGET.ASSEM            Page 371
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


290C               11931                 .Page
290C               11932 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
290C               11933 ;>
290C               11934 ;>      Procedure: SrvoRcvry { ServoRecovery }
290C               11935 ;>
290C               11936 ;>      This procedure's responsiblity is to do everything within reason
290C               11937 ;>      to make certain that the Servo Processor is Healthy, Wealthy, and
290C               11938 ;>      Wise; and if it can't then there is no point in using the Servo.
290C               11939 ;>
290C               11940 ;>      Inputs: { none }
290C               11941 ;>
290C               11942 ;>      Outputs: { none }
290C               11943 ;>
290C               11944 ;>      Local Variables:
290C               11945 ;>              i       : BYTE { !r8 }
290C               11946 ;>              Error   : BOOLEAN { !r9 }
290C               11947 ;>
290C               11948 ;>      Global Variables Changed:
290C               11949 ;>              On_Track, Cur_Cyl
290C               11950 ;>
290C               11951 ;>      Global Variables Used:
290C               11952 ;>              Cylinder, Head, Sector
290C               11953 ;>
290C               11954 ;>      Algorithm:
290C               11955 ;>
290C               11956 ;>      BEGIN
290C               11957 ;>       i := 8
290C               11958 ;>       REPEAT
290C               11959 ;>        Zero_Header
290C               11960 ;>        Error := False
290C               11961 ;>        IF ServoError
290C               11962 ;>         THEN Error := NOT( ServoOk )
290C               11963 ;>         ELSE
290C               11964 ;>              Error := NOT( ReadHdr )
290C               11965 ;>              IF NOT( Error )
290C               11966 ;>               THEN
290C               11967 ;>                IF ReadHdr.Cylinder <> Cylinder
290C               11968 ;>                 THEN
290C               11969 ;>                      Cur_Cyl := ReadHdr.Cylinder
290C               11970 ;>                      On_Track := False
290C               11971 ;>        IF NOT( On_Track ) THEN Seek( Cylinder, Head, Sector )
290C               11972 ;>       UNTIL ( i = 0 ) OR NOT( Error )
290C               11973 ;>       IF ( i = 0 ) THEN Abort
290C               11974 ;>      END
290C               11975 ;>
290C               11976 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
290C               11977                 .LSTOFF
290C               11980                 .LSTON











        WIDGET.ASSEM            Page 372
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


290C               11981                 .Page
290C               11982                 .FIN
290C               11983 
290C               11984 SrvoRcvry:
290C D6 22 1B    2011985                 Call    Ext_Push    ;save caller's stuff
290F               11986                 
290F 8C 08        611987                 Ld      !r8,#8  ;i := 8
2911               11988                 
2911 D6 22 91    2011989 Srvo_R_Rpt:     Call    Zero_Header
2914 D6 03 FC    2011990                 Call    LoadStatus
2917 76 E0 10    1011991                 Tm      !r0,#ServoErr
291A 6B 03         11992                 Jr      Z,Srvo_R_Sok
291C               11993                 
291C D6 27 8E    2011994                 Call    ServoOk
291F               11995                 
291F D6 21 6C    2011996 Srvo_R_Sok:     Call    UpDate_Hdr ; IF ReadHdr.Cylinder <> Cylinder...
2922 EB 0C         11997                 Jr      Nz,Srvo_R_Leave
2924               11998                 
2924 0C 01        611999                  Ld     !r0,#1 ;byte1
2926 1C 02        612000                  Ld     !r1,#Stat_Seek
2928 D6 04 03    2012001                 Call    Set_Status
292B               12002                 
292B D6 05 CA    2012003                 Call    ReSeek
292E               12004                  
292E 8A E1         12005 Srvo_DecI:      Djnz    !r8,Srvo_R_Rpt
2930               12006 
2930 D6 22 3C    2012007 Srvo_R_Leave:   Call    Ext_Pop     ;get user's stuff back
2933 8D 04 F8      12008                 Jp      Bank_Ret
2936               12009                 
2936               12010                 .LSTOFF
2936               12012                 .LSTON




























        WIDGET.ASSEM            Page 373
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2936               12013                 .Page
2936               12014 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2936               12015 ;>
2936               12016 ;>      Procedure: Load_SrvoCmnd  { Load Servo Command Buffer }
2936               12017 ;>
2936               12018 ;>      This procedure loads the global array ServoCmndBuffer
2936               12019 ;>      with the information contained within !r0:3
2936               12020 ;>
2936               12021 ;>      Inputs:
2936               12022 ;>              SrvoCmndBuffer[ 0 ] : BYTE { !r0 }
2936               12023 ;>              SrvoCmndBuffer[ 1 ] : BYTE { !r1 }
2936               12024 ;>              SrvoCmndBuffer[ 2 ] : BYTE { !r2 }
2936               12025 ;>              SrvoCmndBuffer[ 3 ] : BYTE { !r3 }
2936               12026 ;>
2936               12027 ;>      Outputs: { none }
2936               12028 ;>
2936               12029 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2936               12030                 .LSTOFF
2936               12033                 .LSTON








































        WIDGET.ASSEM            Page 374
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2936               12034                 .Page
2936               12035                 .FIN
2936               12036 
2936               12037 Load_SrvoCmnd:
2936 2C 14        612038                 Ld      !r2,#.HIBYTE. SrvoCmndBuf
2938 3C B1        612039                 Ld      !r3,#.LOWBYTE. SrvoCmndBuf
293A 1C 04        612040                 Ld      !r1,#4 ;load 4 bytes
293C 0C 40        612041                 Ld      !r0,#ScrReg0 ;start with what's in ScrReg0
293E               12042                 
293E 93 02       1812043 Ld_S_Cmnd_Lp:   Ldei    @!!r2,@!r0
2940 1A FC         12044                 Djnz    !r1,Ld_S_Cmnd_Lp
2942               12045                 
2942 AF          1412046                 Ret
2943               12047                 
2943               12048                 .LSTOFF
2943               12077                 .LSTON











































        WIDGET.ASSEM            Page 375
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2943               12078                 .Page
2943               12079                 .FIN
2943               12080 
2943               12081 Park_Heads:
2943 E6 57 80    1012082                  Ld     SeekType,#Access
2946 CC 02        612083                  Ld     !rC,#HiParkCyl
2948 DC 35        612084                  Ld     !rD,#LowParkCyl
294A B0 EE        612085                  Clr    !rE
294C B0 EF        612086                  Clr    !rF
294E D6 26 50    2012087                 Call    Seek
2951               12088                 
2951 46 56 10    1012089                 Or      DiskStat,#Parked
2954 56 56 7F    1012090                 And     DiskStat,#$FF-On_Track
2957 D6 29 FD    2012091                 Call    Set_SeekNeeded
295A 8D 04 F8      12092                 Jp      Bank_Ret
295D               12093                 
295D               12094                 .LSTOFF
295D               12096                 .LSTON









































        WIDGET.ASSEM            Page 376
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


295D               12097                 .Page
295D               12098 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
295D               12099 ;>
295D               12100 ;>      Procedure: ResetServo
295D               12101 ;>
295D               12102 ;>      This procedure is responsible for performing all the 
295D               12103 ;>      necessary tasks in resetting the servo. This includes
295D               12104 ;>      setting the correct Baud rates ( the servo comes up
295D               12105 ;>      at 19.2k baud, but normally runs at 57.6k baud ) and
295D               12106 ;>      positioning the heads over the data field and keeping 
295D               12107 ;>      the world straight about it ( cylinder is set to
295D               12108 ;>      MaxDataCylinder because a DataRecal positions the heads
295D               12109 ;>      at the closest data cylinder to the inside ).
295D               12110 ;>
295D               12111 ;>      Inputs: { none }
295D               12112 ;>
295D               12113 ;>      Outputs: { none }
295D               12114 ;>
295D               12115 ;>      Algorithm:
295D               12116 ;>
295D               12117 ;>      BEGIN
295D               12118 ;>       ServoRst := True
295D               12119 ;>       Wait for 18 instructions ( about ) to make certain that Reset is valid
295D               12120 ;>       ServoRst := False
295D               12121 ;>       Wait for 2 secs to allow motor and servo to get ready
295D               12122 ;>       IF NOT( ServoRdy ) OR ServoError THEN Abort
295D               12123 ;>       Baud Rate := 19.2k
295D               12124 ;>       IF NOT( ServoStore( ReadStatus, x, x, BaudRate57.6 + NormalStatus ) )
295D               12125 ;>        THEN Abort
295D               12126 ;>       IF NOT( ServoLoad( NormalReadStatusBuffer ) )
295D               12127 ;>        THEN Abort
295D               12128 ;>       Baud Rate := 57.6K
295D               12129 ;>       IF NOT( Restore( DataRecal ) ) THEN Abort
295D               12130 ;>       DiskStatus.On_Track := False
295D               12131 ;>      END
295D               12132 ;>
295D               12133 ;>      Global Variables Changed:
295D               12134 ;>              Cylinder
295D               12135 ;>
295D               12136 ;>              
295D               12137 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
295D               12138                 .LSTOFF
295D               12141                 .LSTON
















        WIDGET.ASSEM            Page 377
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


295D               12142                 .Page
295D               12143                 .FIN
295D               12144 
295D               12145 ResetServo:
295D 56 00 EF    1012146                 And     Port0,#$FF-Not_ServoRst ;set Servo Reset
2960               12147                 
2960 2C 00        612148 S_Rst_Lp1:       Ld     !r2,#.HIBYTE. 5 ;busy wait for 50 msec
2962 3C 05        612149                  Ld     !r3,#.LOWBYTE. 5
2964 D6 01 CB    2012150                 Call    MsWait
2967               12151                 
2967 46 00 10    1012152                 Or      Port0,#Not_ServoRst ;clear Servo Reset
296A               12153 
296A 2C 00        612154                  Ld     !r2,#.HIBYTE. 100 ;busy wait for 1 sec
296C 3C 64        612155                  Ld     !r3,#.LOWBYTE. 100
296E D6 01 CB    2012156                 Call    MsWait
2971               12157                 
2971 D6 03 FC    2012158 S_Rst_1:        Call    LoadStatus ;get servo status
2974 76 E0 10    1012159                 Tm      !r0,#ServoErr
2977 6B 05         12160                 Jr      Z,S_Rst_Bd1
2979               12161                 
2979 A8 E0        612162 S_Rst_Abt1:      Ld     !rA,!r0
297B D6 05 1F    2012163                 Call    Abort
297E               12164                 
297E 56 F1 FD    1012165 S_Rst_Bd1:      And     Tmr,#$FF-T0_CntEn        ;halt T0
2981 E6 F5 0D    1012166                 Ld      Pre0,#$D ;Pre0 := Mod-64,continuous;go to 19.2k baud
2984 E6 F4 01    1012167                 Ld      T0,#1   ;interrupt after 1 byte
2987 46 F1 03    1012168                 Or      Tmr,#T0_CntEn + T0_Load
298A               12169                 
298A D6 04 13    2012170                 Call    Set_Dmt
298D 31 40        612171                  Srp    #Wrk_Scr
298F 0C 00        612172                  Ld     !r0,#ReadStatus  ;try talking to the Servo
2991 B0 E1        612173                  Clr    !r1
2993 B0 E2        612174                  Clr    !r2
2995 3C 81        612175                  Ld     !r3,#S_Norm_Status + S_Rate_57_6
2997 31 10        612176                  Srp    #Wrk_Sys
2999 D6 29 36    2012177                 Call    Load_SrvoCmnd
299C D6 28 41    2012178                 Call    ServoStore
299F 6B 08         12179                 Jr      Z,S_Rst_Comm
29A1 D6 03 FC    2012180                 Call    Load_Status
29A4 76 E0 10    1012181                 Tm      !r0,#ServoErr
29A7 6B 09         12182                 Jr      Z,S_Rst_Ld
29A9               12183                 
29A9 AC 00        612184 S_Rst_Comm:      Ld     !rA,#S_Store
29AB 8C 03        612185 S_Rst_Abt2:      Ld     !r8,#S_Rst_Abort
29AD 9C 01        612186                  Ld     !r9,#Comm_Err
29AF D6 05 1F    2012187                 Call   Abort
29B2               12188                 
29B2 D6 28 7E    2012189 S_Rst_Ld:       Call    ServoLoad
29B5 7C 01        612190                  Ld     !r7,#S_Load
29B7 EB F2         12191                 Jr      Nz,S_Rst_Abt2
29B9               12192 
29B9 56 F1 FD    1012193                 And     Tmr,#$FF-T0_CntEn        ;halt T0
29BC E6 F5 05    1012194                 Ld      Pre0,#$5 ;Pre0 := 1,continuous run ;go to 57.6k baud
29BF E6 F4 01    1012195                 Ld      T0,#1





        WIDGET.ASSEM            Page 378
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


29C2 46 F1 03    1012196                 Or      Tmr,#T0_CntEn + T0_Load
29C5               12197                 
29C5 31 40        612198                  Srp    #Wrk_Scr
29C7 0C 40        612199                  Ld     !r0,#DataRecal
29C9 B0 E1        612200                  Clr    !r1
29CB B0 E2        612201                  Clr    !r2
29CD 3C 80        612202                  Ld     !r3,#S_Rate_57_6
29CF 31 10        612203                  Srp    #Wrk_Sys
29D1 D6 29 36    2012204                 Call    Load_SrvoCmnd
29D4 D6 28 41    2012205                 Call    ServoStore
29D7 AC 00        612206                  Ld     !rA,#S_Store
29D9 6B D0         12207                 Jr      Z,S_Rst_Abt2
29DB               12208                 
29DB D6 04 1F    2012209                 Call    Clr_Dmt
29DE 4C D5        612210                 Ld      !r4,#$D5 ;wait for max of 2 secs
29E0 B0 E5        612211                 Clr     !r5
29E2               12212                 
29E2 D6 03 FC    2012213 Reset_S_Lp:     Call    LoadStatus
29E5 76 E0 20    1012214                 Tm      !r0,#ServoRdy
29E8 EB 04         12215                 Jr      Nz,Reset_S_End
29EA 80 E4       1012216                 Decw    !!r4
29EC EB F4         12217                 Jr      Nz,Reset_S_Lp
29EE               12218                 
29EE 56 56 7E    1012219 Reset_S_End:    And     DiskStatus,#$FF-On_Track-Offset_On
29F1 46 56 02    1012220                 Or      DiskStatus,#SeekComplete
29F4               12221                 
29F4 E6 50 01    1012222                 Ld      Cur_Cyl,#Init_HiCyl
29F7 E6 51 F9    1012223                 Ld      Cur_Cyl+1,#Init_LoCyl
29FA               12224                 
29FA 8D 04 F8      12225 S_Rst_2:        Jp      Bank_Ret
29FD               12226 
29FD               12227                 .LSTOFF
29FD               12229                 .LSTON


























        WIDGET.ASSEM            Page 379
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


29FD               12230                 .Page
29FD               12231 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
29FD               12232 ;>
29FD               12233 ;>      Procedure: Set_SeekNeeded
29FD               12234 ;>
29FD               12235 ;>      This procedure acts in much the same fashion for the
29FD               12236 ;>      LogicalBlockCache as DiskStat.On_Track does for simple
29FD               12237 ;>      seeks. It keeps a legitimate seeks between tow requests
29FD               12238 ;>      for the same block number from returning a bogus result.
29FD               12239 ;>
29FD               12240 ;>      Inputs: { none }
29FD               12241 ;>
29FD               12242 ;>      Outputs: { none }
29FD               12243 ;>
29FD               12244 ;>      Algorithm:
29FD               12245 ;>
29FD               12246 ;>      BEGIN
29FD               12247 ;>       FOR i := 1 TO CacheLength DO
29FD               12248 ;>        CachStat[ i ].SeekNeeded := True
29FD               12249 ;>      END
29FD               12250 ;>
29FD               12251 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
29FD               12252                 .LSTOFF
29FD               12255                 .LSTON



































        WIDGET.ASSEM            Page 380
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


29FD               12256                 .Page
29FD               12257                 .FIN
29FD               12258 
29FD               12259 Set_SeekNeeded:
29FD 2C 16        612260                 Ld      !r2,#.HIBYTE. CachStat
29FF 3C E8        612261                 Ld      !r3,#.LOWBYTE. CachStat
2A01 1C 14        612262                 Ld      !r1,#CacheLength
2A03               12263 
2A03 82 02       1212264 S_SeekN_Lp:     Lde     !r0,@!!r2 ;get array value
2A05 46 E0 80    1012265                 Or      !r0,#CachSeek
2A08 92 02       1212266                 Lde     @!!r2,!r0
2A0A A0 E2       1012267                 Incw    !!r2
2A0C 1A F5         12268                 Djnz    !r1,S_SeekN_Lp
2A0E               12269                 
2A0E 8D 04 F8      12270                 Jp      Bank_Ret
2A11               12271                 
2A11               12272                 .LSTOFF
2A11               12277                 .LSTON









































        WIDGET.ASSEM            Page 381
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2A11               12278                 .Page
2A11               12279 ;>>>>>>>>>>>>>>>>>>>>>>>>
2A11               12280 ;>
2A11               12281 ;>      Module: Selftest
2A11               12282 ;>
2A11               12283 ;>      THIS MODULE IS INTENDED TO RUN IN BANK 1
2A11               12284 ;>
2A11               12285 ;>      FUNCTION: MtrSpd
2A11               12286 ;>      FUNCTION: TrackCount
2A11               12287 ;>      FUNCTION: SctrCount
2A11               12288 ;>      FUNCTION: RwTest
2A11               12289 ;>
2A11               12290 ;>>>>>>>>>>>>>>>>>>>>>>>>
2A11               12291                 .LSTOFF
2A11               12294                 .LSTON












































        WIDGET.ASSEM            Page 382
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2A11               12295                 .Page
2A11               12296                 .FIN
2A11               12297                 
2A11 76 24 10    1012298 SelfTest:       Tm      Excpt_Stat,#PwrRst ;check for power reset
2A14 6B 0E         12299                 Jr      Z,ST_MtrSpd
2A16               12300                 
2A16 08 38        612301                 Ld      !r0,Scr_Cntr ;otherwise finish time on disk speed
2A18 44 39 E0    1012302                 Or      !r0,Scr_Cntr+1
2A1B 6B 07         12303                 Jr      Z,ST_MtrSpd
2A1D               12304                 
2A1D 28 38        612305                  Ld     !r2,Scr_Cntr
2A1F 38 39        612306                  Ld     !r3,Scr_Cntr+1
2A21 D6 01 CB    2012307                 Call    MsWait
2A24               12308 
2A24 D6 2A 50    2012309 ST_MtrSpd:      Call    MtrSpd
2A27 EB 24         12310                 Jr      Nz,Slf_Leave
2A29               12311                 
2A29 56 25 DF    1012312                 And     SlfTst_Result,#$FF-Disk_Speed
2A2C               12313 
2A2C D6 2A 92    2012314 Slf_Tracks:     Call    TrackCount
2A2F 56 25 EF    1012315                 And     SlfTst_Result,#$FF-Servo_Fail
2A32               12316                 
2A32 D6 2A B5    2012317 Slf_Sectors:    Call    SctrCount
2A35 EB 16         12318                 Jr      Nz,Slf_Leave
2A37               12319                 
2A37 56 25 F7    1012320                 And     SlfTst_Result,#$FF-Sector_Cnt
2A3A               12321                 
2A3A D6 03 FC    2012322 Slf_State:      Call    Load_Status ;check state machine static state
2A3D 56 E0 0F    1012323                 And     !r0,#YMask
2A40 EB 0B         12324                 Jr      Nz,Slf_Leave
2A42               12325                 
2A42 56 25 FB    1012326                 And     SlfTst_Result,#$FF-State_Fail
2A45               12327                 
2A45 D6 2A D6    2012328 Slf_RwTest:     Call    RwTest ;see if we can read and write
2A48 6B 03         12329                 Jr      Z,Slf_Leave
2A4A               12330                 
2A4A 56 25 FD    1012331                 And     SlfTst_Result,#$FF-Rw_Fail
2A4D               12332                 
2A4D 8D 04 F8      12333 Slf_Leave:      Jp      Bank_Ret
2A50               12334 
2A50               12335                 .LSTOFF
2A50               12337                 .LSTON

















        WIDGET.ASSEM            Page 383
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2A50               12338                 .Page
2A50               12339 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2A50               12340 ;>
2A50               12341 ;>      Function: MtrSpd  { Motor Speed }
2A50               12342 ;>
2A50               12343 ;>      This function is responsible for measuring the motor
2A50               12344 ;>      speed. This is done by timing the interval between
2A50               12345 ;>      consectutive index marks.
2A50               12346 ;>
2A50               12347 ;>      Inputs: { none }
2A50               12348 ;>
2A50               12349 ;>      Outputs:
2A50               12350 ;>              MtrSpd : BOOLEAN { zero flag NOT set if failure }
2A50               12351 ;>
2A50               12352 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2A50               12353                 .LSTOFF
2A50               12356                 .LSTON










































        WIDGET.ASSEM            Page 384
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2A50               12357                 .Page
2A50               12358                 .FIN
2A50               12359                 
2A50               12360 
2A50 56 FA FE    1012361 MtrSpd:         And     Irq,#$FF-Irq_Index ;clear old event
2A53 B0 E0        612362                 Clr     !r0
2A55 B0 E1        612363                 Clr     !r1 ;clear counter
2A57 4C 10        612364                 Ld      !r4,#16 ;load dead man timer
2A59 B0 E5        612365                 Clr     !r5
2A5B D6 04 13    2012366                 Call    SetDmt ;entering critcal section - don't hangup!
2A5E               12367                 
2A5E 76 FA 01    1012368 MtrSpd_1:       Tm      Irq,#Irq_Index ;wait for index to come around
2A61 6B FB         12369                 Jr      Z,MtrSpd_1
2A63               12370                 
2A63 56 FA FA    1012371                 And     Irq,#$FF-Irq_Index-Irq_Sector ;clear events
2A66 D6 04 1F    2012372                 Call    ClrDmt ;leave crtical section
2A69               12373                 
2A69 76 FA 01    1012374 MtrSpd_Lp:      Tm      Irq,#Irq_Index ;wait for one rev
2A6C EB 06         12375                 Jr      Nz,MtrSpd_End
2A6E A0 E0       1012376                 Incw    !!r0            ;.0142 ms/lp or 70.4 cnts/ms
2A70 80 E4       1012377                 Decw    !!r4
2A72 EB F5         12378                 Jr      Nz,MtrSpd_Lp
2A74               12379                 
2A74 E8 E1        612380 MtrSpd_End:      Ld     !rE,!r1
2A76 D8 E0        612381                  Ld     !rD,!r0
2A78 CC 00        612382                  Ld     !rC,#0
2A7A 2C 25        612383                  Ld     !r2,#.HIBYTE. Div3_19
2A7C 3C 7C        612384                  Ld     !r3,#.LOWBYTE. Div3_19
2A7E D6 04 AB    2012385                 Call    Bank_Call ;get speed within tolerence in !r2
2A81               12386                 .LSTOFF
2A81               12388                 .LSTON
2A81 0C 01        612389                 Ld      !r0,#1 ;assume failure
2A83 A6 E2 44    1012390                 Cp      !r2,#$44 ;accepts speeds between 18.5 ms and 20.5 ms
2A86 1B 07         12391                 Jr      Lt,MtrSpd_Lv
2A88 A6 E2 4C    1012392                 Cp      !r2,#$4C
2A8B AB 02         12393                 Jr      Gt,MtrSpd_Lv
2A8D 0C 00        612394                 Ld      !r0,#0 ;otherwise pass
2A8F               12395                 .FIN
2A8F   --SKIP--    12396                 .DO     W_20MB+W_40MB
2A8F   --SKIP--    12397                 .LSTON
2A8F   --SKIP--    12398                 Ld      !r0,#1 ;assume failure
2A8F   --SKIP--    12399                 Cp      !r2,#$48 ;accepts speeds between 18.5 ms and 20.5 ms
2A8F   --SKIP--    12400                 Jr      Lt,MtrSpd_Lv
2A8F   --SKIP--    12401                 Cp      !r2,#$4C
2A8F   --SKIP--    12402                 Jr      Gt,MtrSpd_Lv
2A8F   --SKIP--    12403                 Ld      !r0,#0 ;otherwise pass
2A8F               12404                 .FIN
2A8F               12405                 
2A8F 42 00        612406 MtrSpd_Lv:      Or      !r0,!r0 ;set flags
2A91 AF          1412407                 Ret
2A92               12408                 
2A92               12409                 .LSTOFF
2A92               12411                 .LSTON






        WIDGET.ASSEM            Page 385
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2A92               12412                 .Page
2A92               12413 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2A92               12414 ;>
2A92               12415 ;>      Function: TrackCount
2A92               12416 ;>
2A92               12417 ;>      This function is responsible for counting the number of
2A92               12418 ;>      tracks that are available on the servo.
2A92               12419 ;>
2A92               12420 ;>      Inputs: { none }
2A92               12421 ;>
2A92               12422 ;>      Outputs:
2A92               12423 ;>              TrackCount : BOOLEAN { zero flag NOT set if failure }
2A92               12424 ;>
2A92               12425 ;>      Algorithm:
2A92               12426 ;>
2A92               12427 ;>      BEGIN
2A92               12428 ;>       Restore( FormatRecal )
2A92               12429 ;>       Seek( Cyl=0 )
2A92               12430 ;>      END
2A92               12431 ;>
2A92               12432 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2A92               12433                 .LSTOFF
2A92               12436                 .LSTON




































        WIDGET.ASSEM            Page 386
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2A92               12437                 .Page
2A92               12438                 .FIN
2A92               12439 
2A92               12440 TrackCount:
2A92 2C 29        612441                  Ld     !r2,#.HIBYTE. ResetServo
2A94 3C 5D        612442                  Ld     !r3,#.LOWBYTE. ResetServo
2A96 D6 04 AB    2012443                 Call    Bank_Call ;try to get the servo in a nice state
2A99               12444                 
2A99 56 56 BF    1012445                 And     DiskStat,#$FF-RdHdrRecal ;don't read any headers!
2A9C               12446                 
2A9C 0C 40        612447                  Ld     !r0,#DataRecal
2A9E 2C 28        612448                  Ld     !r2,#.HIBYTE. Restore
2AA0 3C A0        612449                  Ld     !r3,#.LOWBYTE. Restore
2AA2 D6 04 AB    2012450                 Call    Bank_Call
2AA5               12451                 
2AA5 CC 00        612452                  Ld     !rC,#0 ;cylinder = 0
2AA7 DC 69        612453                  Ld     !rD,#$69
2AA9 EC 00        612454                  Ld     !rE,#0 ;head = 0
2AAB FC 00        612455                  Ld     !rF,#0 ;sector = 0
2AAD 2C 26        612456                  Ld     !r2,#.HIBYTE. Seek
2AAF 3C 50        612457                  Ld     !r3,#.LOWBYTE. Seek
2AB1 D6 04 AB    2012458                 Call    Bank_Call
2AB4 AF          1412459                 Ret
2AB5               12460                 
2AB5               12461                 .LSTOFF
2AB5               12463                 .LSTON

































        WIDGET.ASSEM            Page 387
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2AB5               12464                 .Page
2AB5               12465 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2AB5               12466 ;>
2AB5               12467 ;>      Function: SctrCount
2AB5               12468 ;>
2AB5               12469 ;>      This function counts the number of sector marks between
2AB5               12470 ;>      successive index marks and returns a true value if
2AB5               12471 ;>      the number of sectors counted equals NbrSctrs.
2AB5               12472 ;>
2AB5               12473 ;>      Inputs: { none }
2AB5               12474 ;>
2AB5               12475 ;>      Outputs:
2AB5               12476 ;>              SctrCount : BOOLEAN { zero flag is set if true }
2AB5               12477 ;>
2AB5               12478 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2AB5               12479                 .LSTOFF
2AB5               12482                 .LSTON










































        WIDGET.ASSEM            Page 388
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2AB5               12483                 .Page
2AB5               12484                 .FIN
2AB5               12485 
2AB5               12486 SctrCount:
2AB5 B0 E2        612487                 Clr     !r2 ;count := 0
2AB7               12488                 
2AB7 56 FA FE    1012489                 And     Irq,#$FF-Irq_Index ;clear old index marks
2ABA               12490 
2ABA 76 FA 01    1012491 S_Cnt_1:        Tm      Irq,#Irq_Index ;wait for index mark
2ABD 6B FB         12492                 Jr      Z,S_Cnt_1
2ABF               12493                 
2ABF 56 FA FD    1012494                 And     Irq,#Irq_Index-Irq_Sector ;clear old events
2AC2               12495                 
2AC2 76 03 04    1012496 S_Cnt_3:        Tm      Port3,#IndexMark ;While NOT( Index )
2AC5 EB 0B         12497                 Jr      Nz,S_Cnt_End
2AC7 76 FA 04    1012498                 Tm      Irq,#Irq_Sector
2ACA 6B F6         12499                 Jr      Z,S_Cnt_3
2ACC 2E           612500                 Inc     !r2 ;bump the sector count
2ACD 56 FA FB    1012501                 And     Irq,#$FF-Irq_Sector
2AD0 8B F0         12502                 Jr      S_Cnt_3
2AD2               12503                 
2AD2 A6 E2 13    1012504 S_Cnt_End:      Cp      !r2,#NbrSctrs
2AD5               12505                 
2AD5 AF          1412506                 Ret
2AD6               12507                 
2AD6               12508                 .LSTOFF
2AD6               12510                 .LSTON
































        WIDGET.ASSEM            Page 389
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2AD6               12511                 .Page
2AD6               12512 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2AD6               12513 ;>
2AD6               12514 ;>      Function: RwTest
2AD6               12515 ;>
2AD6               12516 ;>      This test moves the heads over a track away from the data
2AD6               12517 ;>      area { useable data area } and performs a write verify 
2AD6               12518 ;>      on block zero of that track. If a failure occurs, the test
2AD6               12519 ;>      will continue on the next sequential sector on that track
2AD6               12520 ;>      until all sectors have been written to. If there are no 
2AD6               12521 ;>      successful transfers on any of the sectors of this track then
2AD6               12522 ;>      the test is assumed to have failed.
2AD6               12523 ;>
2AD6               12524 ;>      Inputs: { none }
2AD6               12525 ;>
2AD6               12526 ;>      Outputs:
2AD6               12527 ;>              RwTest : BOOLEAN { zero flag set if failure }
2AD6               12528 ;>
2AD6               12529 ;>      Algorithm:
2AD6               12530 ;>
2AD6               12531 ;>      BEGIN
2AD6               12532 ;>       Seek( RwTest track )
2AD6               12533 ;>       REPEAT
2AD6               12534 ;>        IF NOT( WrVer_Common ) AND ( RdErrCnt = 10 )
2AD6               12535 ;>         THEN 
2AD6               12536 ;>          Sector := Sector + 1
2AD6               12537 ;>          IF ( Sector > NbrSctrs )
2AD6               12538 ;>           THEN Done := True
2AD6               12539 ;>         ELSE Done := True
2AD6               12540 ;>       UNTIL Done
2AD6               12541 ;>       IF ( Sector > NbrSctrs )
2AD6               12542 ;>        THEN RwTest := False
2AD6               12543 ;>        ELSE RwTest := True
2AD6               12544 ;>      END
2AD6               12545 ;>              
2AD6               12546 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2AD6               12547                 .LSTOFF
2AD6               12550                 .LSTON





















        WIDGET.ASSEM            Page 390
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2AD6               12551                 .Page
2AD6               12552                 .FIN
2AD6               12553 
2AD6               12554 RwTest:
2AD6 46 56 40    1012555                 Or      DiskStat,#RdHdrRecal
2AD9 0C 40        612556                  Ld     !r0,#DataRecal
2ADB 2C 28        612557                  Ld     !r2,#.HIBYTE. Restore
2ADD 3C A0        612558                  Ld     !r3,#.LOWBYTE. Restore
2ADF D6 04 AB    2012559                 Call    Bank_Call
2AE2 5C 00        612560                  Ld     !r5,#0
2AE4 70 24         12561                 Push    Excpt_Stat ;save state
2AE6 6B 51         12562                 Jr      Z,RwTest_End
2AE8 50 24       1012563                 Pop     Excpt_Stat
2AEA               12564 
2AEA 70 24         12565 RwTest1:        Push    Excpt_Stat
2AEC 46 24 80    1012566                 Or      Excpt_Stat,#Recovery ;let the controller recover errors
2AEF               12567                 
2AEF CC 02        612568                  Ld     !rC,#Tst_HiCyl
2AF1 DC 05        612569                  Ld     !rD,#Tst_LoCyl
2AF3 EC 00        612570                  Ld     !rE,#Tst_Head
2AF5 FC 00        612571                  Ld     !rF,#Tst_Sctr
2AF7 D6 05 D7    2012572                 Call    New_Seek
2AFA               12573                 
2AFA 5C 13        612574                 Ld      !r5,#NbrSctrs
2AFC               12575                 
2AFC 2C 22        612576 RwTest_Lp:       Ld     !r2,#.HIBYTE. Zero_Header
2AFE 3C 91        612577                  Ld     !r3,#.LOWBYTE. Zero_Header
2B00 D6 04 AB    2012578                 Call    Bank_Call
2B03               12579                 
2B03 70 E5         12580                 Push    !r5
2B05 46 56 20    1012581                  Or     DiskStat,#Wr_Op
2B08 2C 10        612582                  Ld     !r2,#.HIBYTE. WrBlk_Vector
2B0A 3C 7D        612583                  Ld     !r3,#.LOWBYTE. WrBlk_Vector
2B0C D6 04 AB    2012584                 Call    Bank_Call
2B0F 50 E5       1012585                 Pop     !r5
2B11 6B 22         12586                 Jr      Z,Rw_Next
2B13               12587                 
2B13 E6 27 0A    1012588                 Ld      RdErrCnt,#10 ;assume a failure
2B16 70 E5         12589                 Push    !r5
2B18 56 56 DF    1012590                  And    DiskStat,#$FF-Wr_Op
2B1B 2C 10        612591                  Ld     !r2,#.HIBYTE. RdBlk_Vector
2B1D 3C 83        612592                  Ld     !r3,#.LOWBYTE. RdBlk_Vector
2B1F D6 04 AB    2012593                 Call    Bank_Call
2B22 50 E5       1012594                 Pop     !r5
2B24 EB 13         12595                 Jr      Nz,RwTest_End
2B26               12596                 
2B26 76 E0 10    1012597                 Tm      !r0,#RdNoHdrFnd
2B29 EB 0A         12598                 Jr      Nz,Rw_Next
2B2B 08 27        612599                 Ld      !r0,RdErrCnt
2B2D 56 E0 0F    1012600                 And     !r0,#$0F ;mask off unwanted status
2B30 A6 E0 0A    1012601                 Cp      !r0,#10
2B33 EB 04         12602                 Jr      Nz,RwTest_End
2B35               12603                 
2B35 20 55        612604 Rw_Next:        Inc     Sector





        WIDGET.ASSEM            Page 391
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2B37 5A C3         12605                 Djnz    !r5,RwTest_Lp
2B39               12606                 
2B39 2C 29        612607 RwTest_End:      Ld     !r2,#.HIBYTE. Park_Heads
2B3B 3C 43        612608                  Ld     !r3,#.LOWBYTE. Park_Heads
2B3D D6 04 AB    2012609                 Call    Bank_Call
2B40               12610                 
2B40 50 24       1012611                 Pop     Excpt_Stat ;recover original exception state
2B42 42 55        612612                 Or      !r5,!r5 ;set zero flag
2B44 AF          1412613                 Ret
2B45               12614                 
2B45               12615                 .LSTOFF
2B45               12620                 .LSTON















































        WIDGET.ASSEM            Page 392
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2B45               12621                 .Page
2B45               12622 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2B45               12623 ;>
2B45               12624 ;>      Module: Cache.B1
2B45               12625 ;>
2B45               12626 ;>      BANK 1 MODULE
2B45               12627 ;>
2B45               12628 ;>      This module contains those Cache routines that must be located
2B45               12629 ;>      in Bank 1.
2B45               12630 ;>
2B45               12631 ;>      PROCEDURE Load_Cache
2B45               12632 ;>
2B45               12633 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2B45               12634                 .LSTOFF
2B45               12637                 .LSTON












































        WIDGET.ASSEM            Page 393
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2B45               12638                 .Page
2B45               12639 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2B45               12640 ;>
2B45               12641 ;>      Procedure: Load_Cache
2B45               12642 ;>
2B45               12643 ;>      This procedure loads the 'cache-table' with the next 7
2B45               12644 ;>      sequential logical blocks ( from the current logical block )
2B45               12645 ;>      and status' associated with each block ( i.e., if no seek is
2B45               12646 ;>      required, if a head change is required, etc. ) and the
2B45               12647 ;>      head and sector number of each logical block ( assuming that
2B45               12648 ;>      all the blocks are on the same track ). It should be noted that
2B45               12649 ;>      the status bytes are kept in a seperate table.
2B45               12650 ;>
2B45               12651 ;>      Inputs: { none }
2B45               12652 ;>
2B45               12653 ;>      Outputs: { none }
2B45               12654 ;>
2B45               12655 ;>      Algorithm:
2B45               12656 ;>
2B45               12657 ;>      BEGIN
2B45               12658 ;>       Data_Type := User_Type
2B45               12659 ;>       FOR i := 1 TO CacheLength DO
2B45               12660 ;>        Cur_Block := LogicalBlock + i
2B45               12661 ;>        TempCyl, TempHead, TempSector,
2B45               12662 ;>                      SrchStat, SrchPtr := CnvrtLogical( Cur_Block )
2B45               12663 ;>        CacheStatus[ i - 1 ].Seek := CalcMagDir( TempCyl )
2B45               12664 ;>        IF ( TempHead <> Head )
2B45               12665 ;>         THEN CacheStatus[ i - 1 ].HeadChange := True
2B45               12666 ;>         ELSE CacheStatus[ i - 1 ].HeadChange := False
2B45               12667 ;>        CacheArray[ i - 1 ].LogicalBlock := Cur_Block
2B45               12668 ;>        CacheArray[ i - 1 ].Head := TempHead
2B45               12669 ;>        CacheArray[ i - 1 ].Sector := TempSector
2B45               12670 ;>       Cache_Index := 0
2B45               12671 ;>      END
2B45               12672 ;>
2B45               12673 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2B45               12674                 .LSTOFF
2B45               12677                 .LSTON





















        WIDGET.ASSEM            Page 394
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2B45               12678                 .Page
2B45               12679                 .FIN
2B45               12680 
2B45               12681 Load_Cache:
2B45 4C 14        612682                 Ld      !r4,#CacheLength
2B47 5C 00        612683                 Ld      !r5,#0 ;clear seekneeded, headchange booleans
2B49 E6 58 02    1012684                 Ld      Data_Type,#User_Type
2B4C               12685                 
2B4C 8C 16        612686                 Ld      !r8,#.HIBYTE. CachStat
2B4E 9C E8        612687                 Ld      !r9,#.LOWBYTE. CachStat
2B50 AC 16        612688                 Ld      !rA,#.HIBYTE. CacheArray
2B52 BC FC        612689                 Ld      !rB,#.LOWBYTE. CacheArray
2B54               12690                  
2B54 D6 06 0D    2012691                 Call    Load_Logical
2B57               12692                 
2B57 2C 17        612693                  Ld     !r2,#.HIBYTE. TLBlock
2B59 3C 51        612694                  Ld     !r3,#.LOWBYTE. TLBlock
2B5B D6 2C 89    2012695                 Call    St_Blk
2B5E               12696                 
2B5E D6 2C 91    2012697                 Call    Ld_C_Srch
2B61 70 FC         12698                  Push   Flags   ;save result of spare table search
2B63 70 E0         12699                  Push   !r0
2B65 2C 17        612700                  Ld     !r2,#.HIBYTE. PBlock
2B67 3C 4E        612701                  Ld     !r3,#.LOWBYTE. PBlock
2B69 D6 2C 89    2012702                 Call    St_Blk
2B6C D6 2C 39    2012703                 Call    Cache_Cnvrt
2B6F 50 E0       1012704                  Pop    !r0
2B71 50 FC       1012705                  Pop    Flags
2B73 B0 E1        612706                 Clr     !r1 ;SeekNeeded,HdChg := False
2B75 EB 1A         12707                 Jr      Nz,Ld_Cache_In
2B77 8D 2B EF*09   12708                 Jp      Ld_C_Enter
2B7A               12709                 
2B7A 2C 17        612710 Ld_Cache_Lp:     Ld     !r2,#.HIBYTE. PBlock
2B7C 3C 4E        612711                  Ld     !r3,#.LOWBYTE. PBlock
2B7E D6 2C 69    2012712                 Call    Inc_Blk
2B81 2C 17        612713                  Ld     !r2,#.HIBYTE. TLBlock
2B83 3C 51        612714                  Ld     !r3,#.LOWBYTE. TLBlock
2B85 D6 2C 69    2012715                 Call    Inc_Blk
2B88               12716                 
2B88 D6 2C 91    2012717                 Call    Ld_C_Srch
2B8B 6B 09         12718                 Jr      Z,Cache_NoSpare
2B8D               12719                 
2B8D 1C 80        612720                  Ld     !r1,#CachSeek
2B8F 42 51        612721                  Or     !r5,!r1 ;set seekneeded
2B91 D6 2B FB    2012722 Ld_Cache_In:    Call    Enter_Cache
2B94 8B 5E         12723                 Jr      Ld_Cache_More
2B96               12724                 
2B96 31 30        612725 Cache_NoSpare:  Srp     #Wrk_Sys2
2B98 98 1C        612726                 Ld      !r9,Wrk_Sys+$0C
2B9A A8 1D        612727                 Ld      !rA,Wrk_Sys+$0D
2B9C B8 1E        612728                 Ld      !rB,Wrk_Sys+$0E
2B9E 2C 17        612729                  Ld     !r2,#.HIBYTE. PBlock
2BA0 3C 4E        612730                  Ld     !r3,#.LOWBYTE. PBlock
2BA2 0C 3C        612731                  Ld     !r0,#Wrk_Sys2+$0C





        WIDGET.ASSEM            Page 395
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2BA4 D6 2C 62    2012732                 Call    Gt_3_Ldei
2BA7 22 EB        612733                 Sub     !rE,!rB ;IF ( TPBlock <> PBlock ) 
2BA9 32 DA        612734                 Sbc     !rD,!rA
2BAB 32 C9        612735                 Sbc     !rC,!r9
2BAD 42 CD        612736                 Or      !rC,!rD
2BAF 42 CE        612737                 Or      !rC,!rE
2BB1 70 FC         12738                 Push    Flags
2BB3 31 10        612739                 Srp     #Wrk_Sys
2BB5               12740                 
2BB5 2C 17        612741                  Ld     !r2,#.HIBYTE. PBlock
2BB7 3C 4E        612742                  Ld     !r3,#.LOWBYTE. PBlock
2BB9 D6 2C 89    2012743                 Call    St_Blk
2BBC 50 FC       1012744                 Pop     Flags
2BBE EB 20         12745                 Jr      Nz,Ld_Cach_Seek
2BC0               12746                 
2BC0 D6 2C 5A    2012747                 Call    Gt_THS ;load current seek address
2BC3 FE           612748                 Inc     !rF ;bump the sector address
2BC4 A6 EF 13    1012749                 Cp      !rF,#NbrSctrs
2BC7 9B 07         12750                 Jr      Ge,Ld_Cach_HdChg
2BC9               12751                 
2BC9 D6 2C 4B    2012752                 Call    St_THS ;save new seek address
2BCC B0 E1        612753                  Clr    !r1 ;CacheSeek, CachHdChg := False
2BCE 8B 1F         12754                 Jr      Ld_C_Enter
2BD0               12755                 
2BD0 FC 00        612756 Ld_Cach_HdChg:  Ld      !rF,#0 ;start at sector 0
2BD2 A6 EE 00    1012757                 Cp      !rE,#0 ;check for head 0
2BD5 EB 09         12758                 Jr      Nz,Ld_Cach_Seek
2BD7               12759                 
2BD7 EC 01        612760                  Ld      !rE,#1 ;otherwise go to head 1
2BD9 D6 2C 4B    2012761                 Call    St_THS
2BDC 1C 40        612762                 Ld      !r1,#CachHdChg
2BDE 8B 0F         12763                 Jr      Ld_C_Enter
2BE0               12764                 
2BE0 EC 00        612765 Ld_Cach_Seek:   Ld      !rE,#0 ;start at head 0
2BE2 FC 00        612766                 Ld      !rF,#0 ;and sector 0
2BE4 06 ED 01    1012767                 Add     !rD,#1 ;bump the track count by 1
2BE7 16 EC 00    1012768                 Adc     !rC,#0
2BEA D6 2C 4B    2012769                 Call    St_THS
2BED 1C 80        612770                 Ld      !r1,#CachSeek
2BEF               12771 
2BEF 42 51        612772 Ld_C_Enter:      Or     !r5,!r1 ;set seekneeded or headchange
2BF1 D6 2C 08    2012773                 Call    Ld_BlkStat
2BF4               12774                 
2BF4 4A 84         12775 Ld_Cache_More:  Djnz    !r4,Ld_Cache_Lp
2BF6               12776 
2BF6 B0 5B        612777 Ld_Cache_End:   Clr     Cache_Index
2BF8 8D 04 F8      12778                 Jp      Bank_Ret
2BFB               12779 
2BFB               12780 
2BFB               12781 ;************************************
2BFB               12782 
2BFB               12783 
2BFB 76 E0 10    1012784 Enter_Cache:    Tm      !r0,#Spare ;check if block is a spare
2BFE 6B 05         12785                 Jr      Z,Ld_Blk_BB





        WIDGET.ASSEM            Page 396
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2C00               12786                 
2C00 46 E1 01    1012787                 Or      !r1,#S_Block ;set Spare Block status
2C03 8B 03         12788                 Jr      Ld_BlkStat
2C05               12789                 
2C05 46 E1 02    1012790 Ld_Blk_BB:      Or      !r1,#B_Block ;otherwise it must be a Bad Block
2C08               12791                 
2C08 42 15        612792 Ld_BlkStat:     Or      !r1,!r5 ;merge in global seekneeded or headchange
2C0A 92 18       1212793                 Lde     @!!r8,!r1
2C0C               12794                 
2C0C 2C 17        612795 Ld_Cach_Lgcl:    Ld     !r2,#.HIBYTE. TLBlock
2C0E 3C 51        612796                  Ld     !r3,#.LOWBYTE. TLBlock
2C10 D6 2C 8D    2012797                 Call    Gt_Blk
2C13               12798                 
2C13 0C 1C        612799                 Ld      !r0,#Wrk_Sys+$C ;load CacheArray.Logical
2C15 93 0A       1812800                 Ldei    @!!rA,@!r0
2C17 93 0A       1812801                 Ldei    @!!rA,@!r0
2C19 93 0A       1812802                 Ldei    @!!rA,@!r0
2C1B               12803                 
2C1B A0 E8       1012804                 Incw    !!r8 ;set up for the next go 'round
2C1D               12805                 
2C1D D6 2C 5A    2012806                 Call    Gt_THS
2C20 2C 16        612807                 Ld     !r2,#.HIBYTE. Map_Table ;logically remap the sector
2C22 3C 81        612808                 Ld     !r3,#.LOWBYTE. Map_Table
2C24 02 3F        612809                 Add    !r3,!rF
2C26 16 E2 00    1012810                 Adc    !r2,#0
2C29 82 F2       1212811                 Lde    !rF,@!!r2
2C2B F0 EE        812812                 Swap    !rE ;merge Head with sector
2C2D CF           612813                 Rcf
2C2E 90 EE        612814                 Rl      !rE
2C30 90 EE        612815                 Rl      !rE
2C32 42 EF        612816                 Or      !rE,!rF
2C34 92 EA       1212817                 Lde     @!!rA,!rE
2C36               12818                 
2C36 A0 EA       1012819                 Incw    !!rA ;point to next cache entry
2C38               12820                 
2C38 AF          1412821                 Ret
2C39               12822                 
2C39               12823 
2C39 2C 17        612824 Cache_Cnvrt:     Ld     !r2,#.HIBYTE. PBlock
2C3B 3C 4E        612825                  Ld     !r3,#.LOWBYTE. PBlock
2C3D D6 2C 8D    2012826                 Call    Gt_Blk
2C40 2C 20        612827                  Ld     !r2,#.HIBYTE. Get_Cyl_H_S
2C42 3C DA        612828                  Ld     !r3,#.LOWBYTE. Get_Cyl_H_S
2C44 D6 04 AB    2012829                 Call    Bank_Call
2C47 D6 2C 4B    2012830                 Call    St_THS
2C4A AF          1412831                 Ret
2C4B               12832                 
2C4B               12833 
2C4B 2C 17        612834 St_THS:         Ld      !r2,#.HIBYTE. Cur_THS ;store the current seek address
2C4D 3C 54        612835                 Ld      !r3,#.LOWBYTE. Cur_THS
2C4F 0C 1C        612836                 Ld      !r0,#Wrk_Sys+$0C
2C51 93 02       1812837                 Ldei    @!!r2,@!r0
2C53 93 02       1812838 St_3_Ldei:      Ldei    @!!r2,@!r0
2C55 93 02       1812839                 Ldei    @!!r2,@!r0





        WIDGET.ASSEM            Page 397
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2C57 93 02       1812840                 Ldei    @!!r2,@!r0
2C59 AF          1412841                 Ret
2C5A               12842                 
2C5A 2C 17        612843 Gt_THS:         Ld      !r2,#.HIBYTE. Cur_THS ;load the current seek address
2C5C 3C 54        612844                 Ld      !r3,#.LOWBYTE. Cur_THS
2C5E 0C 1C        612845                 Ld      !r0,#Wrk_Sys+$0C
2C60 83 02       1812846                 Ldei    @!r0,@!!r2
2C62 83 02       1812847 Gt_3_Ldei:      Ldei    @!r0,@!!r2
2C64 83 02       1812848                 Ldei    @!r0,@!!r2
2C66 83 02       1812849                 Ldei    @!r0,@!!r2
2C68 AF          1412850                 Ret
2C69               12851 
2C69 0C 1C        612852 Inc_Blk:        Ld      !r0,#Wrk_Sys+$0C
2C6B 83 02       1812853                 Ldei    @!r0,@!!r2
2C6D 83 02       1812854                 Ldei    @!r0,@!!r2
2C6F 83 02       1812855                 Ldei    @!r0,@!!r2
2C71 06 EE 01    1012856                 Add     !rE,#1
2C74 16 ED 00    1012857                 Adc     !rD,#0
2C77 16 EC 00    1012858                 Adc     !rC,#0
2C7A 26 E3 03    1012859                 Sub     !r3,#3 ;get back to original block ptr
2C7D 36 E2 00    1012860                 Sbc     !r2,#0
2C80 0C 1C        612861                 Ld      !r0,#Wrk_Sys+$0C
2C82 93 02       1812862                 Ldei    @!!r2,@!r0
2C84 93 02       1812863                 Ldei    @!!r2,@!r0
2C86 93 02       1812864                 Ldei    @!!r2,@!r0
2C88 AF          1412865                 Ret
2C89               12866                 
2C89 0C 1C        612867 St_Blk:         Ld      !r0,#Wrk_Sys+$0C
2C8B 8B C6         12868                 Jr      St_3_Ldei
2C8D               12869 
2C8D 0C 1C        612870 Gt_Blk:         Ld      !r0,#Wrk_Sys+$0C
2C8F 8B D1         12871                 Jr      Gt_3_Ldei
2C91               12872 
2C91               12873                 

























        WIDGET.ASSEM            Page 398
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2C91               12874                 .PAGE
2C91               12875 
2C91               12876 ;***********************************
2C91               12877 ;
2C91               12878 ;       Fast search of spare table
2C91               12879 ;
2C91               12880 ;***********************************
2C91               12881 
2C91 18 ED        612882 Ld_C_Srch:      Ld      !r1,!rD ;check if head ptr is NIL
2C93 08 EC        612883                 Ld      !r0,!rC ;but first form a headptr structure
2C95 C0 E0        612884                 Rrc     !r0     ;and index into HeadPtr Array
2C97 C0 E1        612885                 Rrc     !r1
2C99 CF           612886                 Rcf
2C9A C0 E1        612887                 Rrc     !r1
2C9C 2C 14        612888                 Ld      !r2,#.HIBYTE. SegPtrArray
2C9E 3C C5        612889                 Ld      !r3,#.LOWBYTE. SegPtrArray
2CA0 02 31        612890                 Add     !r3,!r1
2CA2 16 E2 00    1012891                 Adc     !r2,#0
2CA5 82 02       1212892                 Lde     !r0,@!!r2       ;get headptr and check for NIL
2CA7 76 E0 80    1012893                 Tm      !r0,#Nil
2CAA 6B 1A         12894                 Jr      Z,Ld_C_Long ;do a real search if not NIL
2CAC               12895                 
2CAC               12896                 .DO     W_10MB
2CAC 08 ED        612897                 Ld      !r0,!rD ;save for possible rollover
2CAE 02 ED        612898                 Add     !rE,!rD ;Physical Block := LBlock + LBlock DIV 256
2CB0 16 ED 00    1012899                 Adc     !rD,#0
2CB3 16 EC 00    1012900                 Adc     !rC,#0
2CB6               12901                 .FIN
2CB6               12902                 
2CB6 A2 0D        612903                 Cp      !r0,!rD ;check for rollover
2CB8 6B 09         12904                 Jr      Z,Ld_C_S_End
2CBA               12905                 
2CBA 06 EE 01    1012906                 Add     !rE,#1 ;otherwise bump Physical Block
2CBD 16 ED 00    1012907                 Adc     !rD,#0
2CC0 16 EC 00    1012908                 Adc     !rC,#0
2CC3               12909                 
2CC3 B2 00        612910 Ld_C_S_End:     Xor     !r0,!r0 ;return zero status
2CC5 AF          1412911 Ld_C_S_Ret:     Ret
2CC6               12912 
2CC6 2C 14        612913 Ld_C_Long:       Ld     !r2,#.HIBYTE. SrchSpTabl
2CC8 3C 7A        612914                  Ld     !r3,#.LOWBYTE. SrchSpTabl
2CCA D6 04 AB    2012915                 Call    Bank_Call
2CCD 8B F6         12916                 Jr      Ld_C_S_Ret
2CCF               12917                  
2CCF               12918                 .LSTOFF
2CCF               12923                 .LSTON













        WIDGET.ASSEM            Page 399
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2CCF               12924                 .Page
2CCF               12925 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2CCF               12926 ;>
2CCF               12927 ;>      Module: Programs
2CCF               12928 ;>
2CCF               12929 ;>      This module contains those routines that are 'high-level'
2CCF               12930 ;>      programs.
2CCF               12931 ;>
2CCF               12932 ;>      PROCEDURE Scan
2CCF               12933 ;>      PROCEDURE Strt_FreeProcess
2CCF               12934 ;>
2CCF               12935 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2CCF               12936                 .LSTOFF
2CCF               12940                 .LSTON













































        WIDGET.ASSEM            Page 400
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2CCF               12941                 .Page
2CCF               12942 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2CCF               12943 ;>
2CCF               12944 ;>      Procedure: Scan
2CCF               12945 ;>
2CCF               12946 ;>      This procedure reads each logical block on the disk and
2CCF               12947 ;>      spares them if they are bad.
2CCF               12948 ;>
2CCF               12949 ;>      Inputs: { none }
2CCF               12950 ;>
2CCF               12951 ;>      Outputs: { none }
2CCF               12952 ;>
2CCF               12953 ;>      Algorithm:
2CCF               12954 ;>
2CCF               12955 ;>      BEGIN
2CCF               12956 ;>       FOR i := 0 TO MaxLogicalBlocks DO
2CCF               12957 ;>        Seek_Type := Access_Offset
2CCF               12958 ;>        Data_Type := User
2CCF               12959 ;>        DiskStat.Wr_Op := False
2CCF               12960 ;>        IF NOT( Srch_Cach( i ) ) OR ( Srch_Cach.SeekNeeded )
2CCF               12961 ;>         THEN 
2CCF               12962 ;>              Seek( CnvrtLogical )
2CCF               12963 ;>              Load_Cache
2CCF               12964 ;>         ELSE
2CCF               12965 ;>              IF ( Srch_Cach.HdChg )
2CCF               12966 ;>               THEN  
2CCF               12967 ;>                      SelectHead( Complement( Head ) )
2CCF               12968 ;>                      Load_Cache
2CCF               12969 ;>               ELSE
2CCF               12970 ;>                      Sector := Srch_Cach.Sector
2CCF               12971 ;>        IF NOT( Read_Common )
2CCF               12972 ;>         THEN Data_Ex_Handler( Read_Common.ErrorCode )
2CCF               12973 ;>      END
2CCF               12974 ;>
2CCF               12975 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2CCF               12976                 .LSTOFF
2CCF               12979                 .LSTON






















        WIDGET.ASSEM            Page 401
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2CCF               12980                 .Page
2CCF               12981                 .FIN
2CCF               12982 
2CCF               12983 D_Scan:
2CCF 2C 1E        612984                  Ld     !r2,#.HIBYTE. ClrNormStat
2CD1 3C 89        612985                  Ld     !r3,#.LOWBYTE. ClrNormStat
2CD3 D6 04 AB    2012986                 Call    Bank_Call
2CD6               12987                 
2CD6 E6 0A 15    1012988                  Ld     Wrk_Io+$A,#D_Scan_Response
2CD9 D6 03 02    2012989                 Call    Ack_Read
2CDC               12990                 
2CDC 76 25 01    1012991 Scan:           Tm      SlfTst_Result,#No_SprTbl
2CDF 6B 03         12992                 Jr      Z,Scan_1
2CE1               12993                 
2CE1 D6 05 1F    2012994                 Call    Abort
2CE4               12995                 
2CE4 0C 00        612996 Scan_1:         Ld      !r0,#0
2CE6 1C 07        612997                 Ld      !r1,#7
2CE8 2C 19        612998                 Ld      !r2,#Wrk_Sys+$09 ;init PBlock and Track-Head-Sector
2CEA F3 20        612999 Scan_Init:      Ld      @!r2,!r0
2CEC 2E           613000                 Inc     !r2
2CED 1A FB         13001                 Djnz    !r1,Scan_Init
2CEF               13002 
2CEF E6 57 80    1013003 Scan_Lp:         Ld     Seek_Type,#Access
2CF2 D6 05 D7    2013004                 Call    New_Seek
2CF5               13005 
2CF5 F9 55        613006 Scan_Read:       Ld     Sector,!rF
2CF7 70 E9         13007                  Push   !r9 ;save somne regs
2CF9 70 EA         13008                  Push   !rA
2CFB 70 EB         13009                  Push   !rB
2CFD 2C 12        613010                  Ld     !r2,#.HIBYTE. Read_Common
2CFF 3C F2        613011                  Ld     !r3,#.LOWBYTE. Read_Common
2D01 D6 04 AB    2013012                 Call    Bank_Call
2D04 50 EB       1013013                  Pop    !rB
2D06 50 EA       1013014                  Pop    !rA
2D08 50 E9       1013015                  Pop    !r9 ;restore regs
2D0A EB 64         13016                 Jr      Nz,Scan_More
2D0C               13017                 
2D0C 56 E0 7F    1013018                 And     !r0,#$FF-RdError ;check for non-fatal error
2D0F 6B 5F         13019                 Jr      Z,Scan_More
2D11               13020                 
2D11 70 E0         13021                  Push   !r0 ;save error code
2D13 D6 22 1B    2013022                 Call    Ext_Push
2D16               13023                 
2D16 1C 00        613024                 Ld      !r1,#0 ;convert to logical interleave
2D18 2C 16        613025                 Ld      !r2,#.HIBYTE. Map_Table
2D1A 3C 81        613026                 Ld      !r3,#.LOWBYTE. Map_Table
2D1C 4C 13        613027                 Ld      !r4,#NbrSctrs
2D1E 82 02       1213028 Scan_Map_Lp:    Lde     !r0,@!!r2
2D20 A2 0F        613029                 Cp      !r0,!rF
2D22 6B 08         13030                 Jr      Z,Scan_Map_End
2D24 A0 E2       1013031                 Incw    !!r2
2D26 1E           613032                 Inc     !r1
2D27 4A F5         13033                 Djnz    !r4,Scan_Map_Lp





        WIDGET.ASSEM            Page 402
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2D29               13034                 
2D29 D6 05 1F    2013035                 Call    Abort
2D2C               13036                 
2D2C 02 B1        613037 Scan_Map_End:   Add     !rB,!r1 ;add in the sector offset
2D2E 16 EA 00    1013038                 Adc     !rA,#0
2D31 16 E9 00    1013039                 Adc     !r9,#0
2D34               13040 ; Convert the Physical block number to a Logical number
2D34               13041                 
2D34               13042                 .DO     W_10MB
2D34 42 BB        613043                 Or      !rB,!rB ;check for spareblock
2D36 6B 35         13044                 Jr      Z,Scan_M_Pop
2D38 22 BA        613045                 Sub     !rB,!rA
2D3A 36 EA 00    1013046                 Sbc     !rA,#0
2D3D 36 E9 00    1013047                 Sbc     !r9,#0
2D40               13048                 .FIN
2D40               13049                 
2D40   --SKIP--    13050                 .DO     W_20MB
2D40   --SKIP--    13051                 Ld      !r0,!rA ;check for spare block
2D40   --SKIP--    13052                 And     !r0,#$01
2D40   --SKIP--    13053                 Or      !r0,!rB
2D40   --SKIP--    13054                 Jr      Z,Scan_M_Pop
2D40   --SKIP--    13055                 Ld      !r1,!r9
2D40   --SKIP--    13056                 Ld      !r2,!rA
2D40   --SKIP--    13057                 Rcf
2D40   --SKIP--    13058                 Rrc     !r1
2D40   --SKIP--    13059                 Rrc     !r2
2D40   --SKIP--    13060                 Sub     !rB,!r2
2D40   --SKIP--    13061                 Sbc     !rA,!r1
2D40   --SKIP--    13062                 Sbc     !r9,#0
2D40               13063                 .FIN
2D40               13064                 
2D40   --SKIP--    13065                 .DO     W_40MB
2D40   --SKIP--    13066                 Ld      !r0,!rA ;check for spare block
2D40   --SKIP--    13067                 And     !r0,#$01
2D40   --SKIP--    13068                 Or      !r0,!rB
2D40   --SKIP--    13069                 Jr      Z,Scan_M_Pop
2D40   --SKIP--    13070                 Ld      !r1,!r9
2D40   --SKIP--    13071                 Ld      !r2,!rA
2D40   --SKIP--    13072                 Ld      !r0,#2
2D40   --SKIP--    13073 P_To_L:         Rcf
2D40   --SKIP--    13074                 Rrc     !r1
2D40   --SKIP--    13075                 Rrc     !r2
2D40   --SKIP--    13076                 Djnz    !r0,P_To_L
2D40   --SKIP--    13077                 Sub     !rB,!r2
2D40   --SKIP--    13078                 Sbc     !rA,!r1
2D40   --SKIP--    13079                 Sbc     !r9,#0
2D40               13080                 .FIN
2D40               13081                 
2D40 2C 14        613082                 Ld      !r2,#.HIBYTE. LogicalBlock
2D42 3C A1        613083                 Ld      !r3,#.LOWBYTE. LogicalBlock
2D44 1C 04        613084                 Ld      !r1,#4
2D46 0C 19        613085                 Ld      !r0,#Wrk_Sys+$09
2D48 93 02       1813086 Scan_LB_Lp:     Ldei    @!!r2,@!r0
2D4A 1A FC         13087                 Djnz    !r1,Scan_LB_Lp





        WIDGET.ASSEM            Page 403
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2D4C               13088                 
2D4C E6 58 02    1013089                  Ld     Data_Type,#User_Type
2D4F D6 2B 45    2013090                 Call    Load_Cache
2D52 D6 06 0D    2013091                 Call    Load_Logical
2D55               13092                 
2D55 2C 10        613093                  Ld     !r2,#.HIBYTE. SC_Vector
2D57 3C 88        613094                  Ld     !r3,#.LOWBYTE. SC_Vector
2D59 D6 04 AB    2013095                 Call    Bank_Call
2D5C               13096                 
2D5C 50 E0       1013097                 Pop     !r0 ;retrieve error code
2D5E 76 5A 03    1013098                 Tm      BlkStat,#B_Block+S_Block ;check for bad block
2D61 EB 0A         13099                 Jr      Nz,Scan_M_Pop
2D63               13100                 
2D63 2C 16        613101 Scan_Rd_Err:     Ld     !r2,#.HIBYTE. Data_Ex_Handler
2D65 3C BD        613102                  Ld     !r3,#.LOWBYTE. Data_Ex_Handler
2D67 D6 04 AB    2013103                 Call    Bank_Call
2D6A               13104                 
2D6A D6 22 91    2013105                 Call    Zero_Header
2D6D               13106                 
2D6D D6 22 3C    2013107 Scan_M_Pop:     Call    Ext_Pop
2D70               13108 
2D70 FE           613109 Scan_More:      Inc     !rF     ;read next sector
2D71 A6 EF 13    1013110                 Cp      !rF,#NbrSctrs ;check for over flow
2D74 1D 2C F5      13111                 Jp      Lt,Scan_Read
2D77               13112                 
2D77 06 EB 13    1013113                 Add     !rB,#NbrSctrs ;go to next set of blocks
2D7A 16 EA 00    1013114                 Adc     !rA,#0
2D7D 16 E9 00    1013115                 Adc     !r9,#0
2D80               13116                 
2D80 FC 00        613117                 Ld      !rF,#0 ;otherwise start at sector 0
2D82 EE           613118                 Inc     !rE    ;and go to next head
2D83 A6 EE 02    1013119                 Cp      !rE,#NbrHds
2D86 9B 06         13120                 Jr      Ge,Scan_IncTrks
2D88               13121                 
2D88 D6 27 38    2013122                 Call    SelectHead
2D8B 8D 2C F5      13123                 Jp      Scan_Read
2D8E               13124                 
2D8E EC 00        613125 Scan_IncTrks:   Ld      !rE,#0 ;otherwise seek to next track
2D90 06 ED 01    1013126                 Add     !rD,#1
2D93 16 EC 00    1013127                 Adc     !rC,#0
2D96 08 EC        613128                 Ld      !r0,!rC ;check for last track
2D98 18 ED        613129                 Ld      !r1,!rD
2D9A B6 E1 01    1013130                 Xor     !r1,#.LOWBYTE. ( NbrTracks-1 )
2D9D B6 E0 02    1013131                 Xor     !r0,#.HIBYTE. ( NbrTracks-1 )
2DA0 42 01        613132                 Or      !r0,!r1
2DA2 ED 2C EF      13133                 Jp      Nz,Scan_Lp
2DA5               13134 
2DA5 D6 29 43    2013135                 Call    Park_Heads
2DA8 2C 1E        613136                  Ld     !r2,#.HIBYTE. ClrNormStat
2DAA 3C 89        613137                  Ld     !r3,#.LOWBYTE. ClrNormStat
2DAC D6 04 AB    2013138                 Call    Bank_Call
2DAF               13139                 
2DAF 8D 04 F8      13140                 Jp      Bank_Ret
2DB2               13141                 





        WIDGET.ASSEM            Page 404
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2DB2               13142                 .LSTOFF
2DB2               13145                 .LSTON

























































        WIDGET.ASSEM            Page 405
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2DB2               13146                 .Page
2DB2               13147 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2DB2               13148 ;>
2DB2               13149 ;>      Procedure: Strt_FreeProcess
2DB2               13150 ;>
2DB2               13151 ;>      BANK 1 PROCEDURE
2DB2               13152 ;>
2DB2               13153 ;>      This procedure is used by the controller to start any process
2DB2               13154 ;>      ( along the lines of internal bookkeeping ) that it chooses.
2DB2               13155 ;>
2DB2               13156 ;>      Inputs: { none }
2DB2               13157 ;>
2DB2               13158 ;>      Outputs: { none }
2DB2               13159 ;>
2DB2               13160 ;>      Algorithm:
2DB2               13161 ;>
2DB2               13162 ;>      BEGIN
2DB2               13163 ;>       IF ( SeekCount >= 2048 )
2DB2               13164 ;>        THEN ArmSweep
2DB2               13165 ;>       Free_SlfTst := 0
2DB2               13166 ;>       WHILE NOT( CMD ) DO
2DB2               13167 ;>              Bsy_Wait for 3 seconds
2DB2               13168 ;>              IF NOT( Parked ) THEN Park_Heads
2DB2               13169 ;>              CASE Free_SlfTst OF
2DB2               13170 ;>               0 : Test Eprom
2DB2               13171 ;>               1 : Test Sector Count
2DB2               13172 ;>               2 : Test Motor Speed
2DB2               13173 ;>               3 : Test Read/Write; Free_SlfTst := 0
2DB2               13174 ;>
2DB2               13175 ;>       Take care of Host
2DB2               13176 ;>
2DB2               13177 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2DB2               13178                 .LSTOFF
2DB2               13181                 .LSTON

























        WIDGET.ASSEM            Page 406
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2DB2               13182                 .Page
2DB2               13183                 .FIN
2DB2               13184                 
2DB2               13185 Strt_FreeProcess:
2DB2 8F           613186                 Di
2DB3 31 10        613187                 Srp     #Wrk_Sys ;get into a reasonable state
2DB5 B0 FE        613188                 Clr     Sph
2DB7 E6 FF 80    1013189                 Ld      Spl,#Stack_Top
2DBA               13190                 
2DBA 56 02 F7    1013191                 And     Port2,#$FF-Bsy ;clear BSY
2DBD               13192                 
2DBD 76 2A FC    1013193                 Tm      SeekCount,#$FC ;do arm sweep every 1k seeks or so
2DC0 6B 20         13194                 Jr      Z,Chk_Park
2DC2               13195                 
2DC2 B0 2A        613196                 Clr     SeekCount
2DC4 B0 2B        613197                 Clr     SeekCount+1
2DC6               13198                 
2DC6 CC 01        613199                  Ld     !rC,#Init_HiCyl ;seek to data recal loaction
2DC8 DC F9        613200                  Ld     !rD,#Init_LoCyl
2DCA EC 00        613201                  Ld     !rE,#0 ;head zero
2DCC FC 00        613202                  Ld     !rF,#0 ;sector zero
2DCE D6 05 D7    2013203                 Call    New_Seek
2DD1               13204                 
2DD1 CC 00        613205                  Ld     !rC,#0
2DD3 DC 00        613206                  Ld     !rD,#0
2DD5 EC 00        613207                  Ld     !rE,#0
2DD7 FC 00        613208                  Ld     !rF,#0
2DD9 D6 05 D7    2013209                 Call    New_Seek
2DDC               13210                 
2DDC 56 56 7F    1013211                 And     DiskStat,#$FF-On_Track
2DDF D6 29 FD    2013212                 Call    Set_SeekNeeded
2DE2               13213                 
2DE2 B0 23        613214 Chk_Park:       Clr     Free_SlfTst ;get ready to do some self tests!
2DE4 2C 00        613215 Chk_Pk_Jp:       Ld     !r2,#.HIBYTE. 200 ;wait for two seconds
2DE6 3C C8        613216                  Ld     !r3,#.LOWBYTE. 200
2DE8 D6 04 21    2013217                 Call    Chk_Park1
2DEB               13218 
2DEB 76 56 10    1013219 Chk_Park3:      Tm      DiskStat,#Parked
2DEE EB 05         13220                 Jr      Nz,FreeP_NoPark
2DF0               13221                 
2DF0 D6 29 43    2013222                 Call    Park_Heads
2DF3 8B EF         13223                 Jr      Chk_Pk_Jp
2DF5               13224                 
2DF5 76 23 01    1013225 FreeP_NoPark:   Tm      Free_SlfTst,#$01 ;check for even value
2DF8 6B 04         13226                 Jr      Z,FreeP_SlfTst   ;to do tests only every other time
2DFA 20 23        613227                 Inc     Free_SlfTst ;otherwise make even for next time
2DFC 8B E6         13228                 Jr      Chk_Pk_Jp
2DFE               13229                 
2DFE 2C 2E        613230 FreeP_SlfTst:   Ld      !r2,#.HIBYTE. SlfTst_Table
2E00 3C 12        613231                 Ld      !r3,#.LOWBYTE. SlfTst_Table
2E02 04 23 E3    1013232                 Add     !r3,Free_SlfTst
2E05 16 E2 00    1013233                 Adc     !r2,#0
2E08 20 23        613234                 Inc     Free_SlfTst ;make value odd
2E0A C2 E2       1213235                 Ldc     !rE,@!!r2





        WIDGET.ASSEM            Page 407
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2E0C A0 E2       1013236                 Incw    !!r2
2E0E C2 F2       1213237                 Ldc     !rF,@!!r2
2E10 30 EE        813238                 Jp      @!rE
2E12               13239                 
2E12 2E 26         13240 SlfTst_Table:   .DW     Free_Ram
2E14 2D E4         13241                 .DW     Chk_Pk_Jp
2E16 2E 34         13242                 .DW     Free_Eprom
2E18 2D E4         13243                 .DW     Chk_Pk_Jp       ;nop
2E1A 2E 4E         13244                 .DW     Free_MtrSpd
2E1C 2D E4         13245                 .DW     Chk_Pk_Jp       ;"
2E1E 2E 40         13246                 .DW     Free_SctrCnt
2E20 2D E4         13247                 .DW     Chk_Pk_Jp       ;"
2E22 2D E4         13248                 .DW     Chk_Pk_Jp       ;"
2E24 2E 5D         13249                 .DW     Free_Rw
2E26               13250                 
2E26 2C 24        613251 Free_Ram:        Ld     !r2,#.HIBYTE. Chk_SprChk
2E28 3C 17        613252                  Ld     !r3,#.LOWBYTE. Chk_SprChk
2E2A D6 04 AB    2013253                 Call    Bank_Call
2E2D EB B5         13254                 Jr      Nz,Chk_Pk_Jp
2E2F               13255                 
2E2F 46 25 80    1013256                 Or      SlfTst_Result,#Ram_Fail
2E32 EB B0         13257                 Jr      Nz,Chk_Pk_Jp
2E34               13258                 
2E34 0C 02        613259 Free_Eprom:      Ld     !r0,#Eprom2
2E36 D6 01 89    2013260                 Call    EpromTest
2E39 6B A9         13261                 Jr      Z,Chk_Pk_Jp
2E3B               13262                 
2E3B 46 25 40    1013263                 Or      SlfTst_Result,#Eprom_Fail
2E3E 8B A4         13264                 Jr      Chk_Pk_Jp
2E40               13265                 
2E40 2C 2A        613266 Free_SctrCnt:    Ld     !r2,#.HIBYTE. SctrCount
2E42 3C B5        613267                  Ld     !r3,#.LOWBYTE. SctrCount
2E44 D6 04 AB    2013268                 Call    Bank_Call
2E47 6B 9B         13269                 Jr      Z,Chk_Pk_Jp
2E49               13270                 
2E49 46 25 08    1013271                 Or      SlfTst_Result,#Sector_Cnt
2E4C 8B 96         13272                 Jr      Chk_Pk_Jp
2E4E               13273                 
2E4E 2C 2A        613274 Free_MtrSpd:     Ld     !r2,#.HIBYTE. MtrSpd
2E50 3C 50        613275                  Ld     !r3,#.LOWBYTE. MtrSpd
2E52 D6 04 AB    2013276                 Call    Bank_Call
2E55 6B 8D         13277                 Jr      Z,Chk_Pk_Jp
2E57               13278                 
2E57 46 25 20    1013279                 Or      SlfTst_Result,#Disk_Speed
2E5A 8D 2D E4*08   13280                 Jp      Chk_Pk_Jp
2E5D               13281                 
2E5D 46 25 02    1013282 Free_Rw:        Or      SlfTst_Result,#Rw_Fail ;assume failure
2E60 2C 2A        613283                  Ld     !r2,#.HIBYTE. RwTest1
2E62 3C EA        613284                  Ld     !r3,#.LOWBYTE. RwTest1
2E64 D6 04 AB    2013285                 Call    Bank_Call
2E67 6D 2D E4      13286                 Jp      Z,Chk_Pk_Jp
2E6A               13287                 
2E6A 56 25 FD    1013288                 And     SlfTst_Result,#$FF-Rw_Fail
2E6D               13289                  





        WIDGET.ASSEM            Page 408
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2E6D B0 23        613290                 Clr     Free_SlfTst
2E6F 8D 2D B2      13291                 Jp      Strt_FreeProcess ;check for arm sweep
2E72               13292                 
2E72               13293                 .LSTOFF
2E72               13298                 .LSTON






















































        WIDGET.ASSEM            Page 409
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2E72               13299                 .Page
2E72               13300 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2E72               13301 ;>
2E72               13302 ;>      Module: Error Check and Correction
2E72               13303 ;>
2E72               13304 ;>      BANK 1 MODULE
2E72               13305 ;>
2E72               13306 ;>      This module contains all the relevant files pertaining
2E72               13307 ;>      to the ECC method and algorithm used on Widget.
2E72               13308 ;>
2E72               13309 ;>      FUNCTION Ecc : BOOLEAN
2E72               13310 ;>      PROCEDURE ShiftAndXor( VAR R1,R2,R3,R4,R5,R6 : BYTE { !r1:6 } )
2E72               13311 ;>      PROCEDURE TestMod8( J : WORD { !!r8 } )
2E72               13312 ;>      PROCEDURE Test0( J : WORD { !!r8 } )
2E72               13313 ;>
2E72               13314 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2E72               13315                 .LSTOFF
2E72               13318                 .LSTON









































        WIDGET.ASSEM            Page 410
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2E72               13319                 .Page
2E72               13320 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2E72               13321 ;>
2E72               13322 ;>      Function: Ecc
2E72               13323 ;>
2E72               13324 ;>      This function is responsible for 1) checking if the data in the
2E72               13325 ;>      ReadBuffer is correctable and 2) correcting that data if it is
2E72               13326 ;>      correctable.
2E72               13327 ;>
2E72               13328 ;>      The method used was prepared by:
2E72               13329 ;>              Neil Glover
2E72               13330 ;>              Data Systems Technology Corp.
2E72               13331 ;>              1801 Aspen St.
2E72               13332 ;>              Broomfield, Co. 80020
2E72               13333 ;>              ( 303 ) 466-5228
2E72               13334 ;>
2E72               13335 ;>      Inputs: { none }
2E72               13336 ;>
2E72               13337 ;>      Outputs:
2E72               13338 ;>              Ecc : BOOLEAN { zero flag is set if not correctable }
2E72               13339 ;>
2E72               13340 ;>      K1 = BitLength( DataField ) + BitLength( CrcField ) + 
2E72               13341 ;>              BitLength( EccField ) - 41
2E72               13342 ;>         = ( 1+532 )*8 + 2*8 + 6*8 - 41
2E72               13343 ;>         = 4287
2E72               13344 ;>
2E72               13345 ;>      Correction Span = 12 bits
2E72               13346 ;>
2E72               13347 ;>      R2Mask = $00
2E72               13348 ;>      R3Mask = $0F
2E72               13349 ;>
2E72               13350 ;>      Syndrome Bytes begin at ReadArray.RBuf1Ecc
2E72               13351 ;>
2E72               13352 ;>      Local Variables:
2E72               13353 ;>              R1      : BYTE { !r1 }
2E72               13354 ;>              R2      : BYTE { !r2 }
2E72               13355 ;>              R3      : BYTE { !r3 }
2E72               13356 ;>              R4      : BYTE { !r4 }
2E72               13357 ;>              R5      : BYTE { !r5 }
2E72               13358 ;>              R6      : BYTE { !r6 }
2E72               13359 ;>              Correctable : BOOLEAN { !r7/bit 7 }
2E72               13360 ;>              Aligned : BOOLEAN { !r7/bit 6 }
2E72               13361 ;>              Done    : BOOLEAN { !r7/bit 5 }
2E72               13362 ;>              J       : WORD { !!r8 }
2E72               13363 ;>
2E72               13364 ;>      Algorithm:
2E72               13365 ;>
2E72               13366 ;>      BEGIN
2E72               13367 ;>       R1 := SyndromeByte[ 1 ] { most significant byte }
2E72               13368 ;>       R2 := SyndromeByte[ 2 ]
2E72               13369 ;>       R3 := SyndromeByte[ 3 ]
2E72               13370 ;>       R4 := SyndromeByte[ 4 ]
2E72               13371 ;>       R5 := SyndromeByte[ 5 ]
2E72               13372 ;>       R6 := SyndromeByte[ 6 ]





        WIDGET.ASSEM            Page 411
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2E72               13373 ;>       IF ( R1=R2=R3=R4=R5=R6=0 )
2E72               13374 ;>        THEN Ecc := False
2E72               13375 ;>        ELSE
2E72               13376 ;>              J := K1
2E72               13377 ;>              Aligned := False
2E72               13378 ;>              Done := False
2E72               13379 ;>              Correctable := False
2E72               13380 ;>              WHILE ( R1 = 0 ) DO
2E72               13381 ;>                      ShiftRegsLeft 1 Byte  { Left-Hand justify syndrome }
2E72               13382 ;>                      J := J + 8
2E72               13383 ;>              While NOT( Done ) OR NOT( Aligned ) DO
2E72               13384 ;>                      ShiftAndXor
2E72               13385 ;>                      IF ( R1 = 0 )
2E72               13386 ;>                       THEN
2E72               13387 ;>                              IF ( R4=R5=R6=0 ) AND ( R2*R2Mask = 0 ) AND
2E72               13388 ;>                                      ( R3*R3Mask )
2E72               13389 ;>                               THEN
2E72               13390 ;>                                      Aligned := True
2E72               13391 ;>                                      TestMod8
2E72               13392 ;>                       IF NOT( Aligned ) THEN Test0
2E72               13393 ;>                       IF NOT( Done ) THEN J := J - 1
2E72               13394 ;>
2E72               13395 ;>              WHILE NOT( Done ) DO
2E72               13396 ;>                      ShiftAndXor
2E72               13397 ;>                      IF ( R1 = 0 )
2E72               13398 ;>                       THEN TestMod8
2E72               13399 ;>                       ELSE Test0
2E72               13400 ;>                      IF NOT( Done ) THEN J := J - 1
2E72               13401 ;>
2E72               13402 ;>              IF Correctable
2E72               13403 ;>               THEN
2E72               13404 ;>                      J := J DIV 8
2E72               13405 ;>                      Buffer1[ J ] := Buffer1[ J ] XOR R2
2E72               13406 ;>                      Buffer1[ J+1 ] := Buffer1[ J+1 ] XOR R3
2E72               13407 ;>                      Buffer1[ J+2 ] := Buffer1[ J+2 ] XOR R4
2E72               13408 ;>                      BlockMove( Buffer2, RBuffer )
2E72               13409 ;>
2E72               13410 ;>              Ecc := Correctable
2E72               13411 ;>      END
2E72               13412 ;>
2E72               13413 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2E72               13414                 .LSTOFF
2E72               13417                 .LSTON
















        WIDGET.ASSEM            Page 412
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2E72               13418                 .Page
2E72               13419                 .FIN
2E72               13420 
2E72 10 BF         13421 K1              .Equ    4287
2E72 00 00         13422 R2Mask          .Equ    0
2E72 00 0F         13423 R3Mask          .Equ    $0F
2E72 00 80         13424 Ecc_Correctable .Equ    $80
2E72 00 40         13425 Ecc_Aligned     .Equ    $40
2E72 00 20         13426 Ecc_Done        .Equ    $20
2E72               13427 
2E72               13428 Ecc:
2E72 B0 E7        613429                 Clr     !r7     ;clear booleans
2E74 8C 10        613430                 Ld      !r8,#.HIBYTE. K1
2E76 9C BF        613431                 Ld      !r9,#.LOWBYTE. K1
2E78               13432                 
2E78 0C 00        613433                 Ld      !r0,#0 ;get ready to check for all zero symdrome
2E7A BC 06        613434                 Ld      !rB,#6  ;load six bytes ;R1..R6 := Syndrome Bytes
2E7C CC 12        613435                 Ld      !rC,#.HIBYTE. RBuf1Ecc
2E7E DC 2F        613436                 Ld      !rD,#.LOWBYTE. RBUf1Ecc
2E80 AC 11        613437                 Ld      !rA,#Wrk_Sys+$01 ;load syndrome bytes into registers
2E82               13438                 
2E82 83 AC       1813439 Ecc_Ld_Lp:      Ldei    @!rA,@!!rC
2E84 43 0A        613440                 Or      !r0,@!rA
2E86 BA FA         13441                 Djnz    !rB,Ecc_Ld_Lp
2E88 6D 2F 17      13442                 Jp      Z,Ecc_End
2E8B               13443                 
2E8B 42 11        613444 Ecc_LHJ_While:  Or      !r1,!r1 ;WHILE ( R1 = 0 ) DO
2E8D EB 14         13445                 Jr      Nz,Ecc_Algn
2E8F               13446                 
2E8F 18 E2        613447                 Ld      !r1,!r2 ;shift left 1 byte
2E91 28 E3        613448                 Ld      !r2,!r3
2E93 38 E4        613449                 Ld      !r3,!r4
2E95 48 E5        613450                 Ld      !r4,!r5
2E97 58 E6        613451                 Ld      !r5,!r6
2E99 B0 E6        613452                 Clr     !r6
2E9B 06 E9 08    1013453                 Add     !r9,#8  ;J := J + 8
2E9E 16 E8 00    1013454                 Adc     !r8,#0
2EA1 8B E8         13455                 Jr      Ecc_LHJ_While
2EA3               13456                 
2EA3 D6 2F 1A    2013457 Ecc_Algn:       Call    ShiftAndXor
2EA6 EB 15         13458                 Jr      Nz,Ecc_Al_1
2EA8               13459                 
2EA8 08 E4        613460                 Ld      !r0,!r4 ;IF ( R4=R5=R6=0 )
2EAA 42 05        613461                 Or      !r0,!r5
2EAC 42 06        613462                 Or      !r0,!r6
2EAE F8 E3        613463                 Ld      !rF,!r3 ;AND ( R3*R3Mask = 0 )
2EB0 56 EF 0F    1013464                 And     !rF,#R3Mask
2EB3 42 0F        613465                 Or      !r0,!rF
2EB5 EB 06         13466                 Jr      Nz,Ecc_Al_1
2EB7               13467                 
2EB7 46 E7 40    1013468                 Or      !r7,#Ecc_Aligned
2EBA D6 2F 3B    2013469                 Call    TestMod8
2EBD               13470                 
2EBD 76 E7 40    1013471 Ecc_Al_1:       Tm      !r7,#Ecc_Aligned





        WIDGET.ASSEM            Page 413
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2EC0 EB 03         13472                 Jr      Nz,Ecc_Al_2
2EC2               13473                 
2EC2 D6 2F 46    2013474                 Call    Test0
2EC5               13475                 
2EC5 76 E7 20    1013476 Ecc_Al_2:       Tm      !r7,#Ecc_Done
2EC8 EB 1D         13477                 Jr      Nz,Ecc_Crct
2ECA               13478                 
2ECA 80 E8       1013479                 Decw    !!r8 ; J := J - 1
2ECC               13480                 
2ECC 76 E7 60    1013481                 Tm      !r7,#Ecc_Done+Ecc_Aligned
2ECF 6B D2         13482                 Jr      Z,Ecc_Algn
2ED1               13483 
2ED1 D6 2F 1A    2013484 Ecc_Shift:      Call    ShiftAndXor
2ED4 EB 05         13485                 Jr      Nz,Ecc_Shft_Else
2ED6               13486                 
2ED6 D6 2F 3B    2013487                 Call    TestMod8
2ED9 8B 03         13488                 Jr      Ecc_Shft_2
2EDB               13489                 
2EDB D6 2F 46    2013490 Ecc_Shft_Else:  Call    Test0
2EDE               13491 
2EDE 76 E7 20    1013492 Ecc_Shft_2:     Tm      !r7,#Ecc_Done
2EE1 EB 04         13493                 Jr      Nz,Ecc_Crct
2EE3               13494                 
2EE3 80 E8       1013495                 Decw    !!r8 ; J := J - 1
2EE5 8B EA         13496                 Jr      Ecc_Shift
2EE7               13497 
2EE7 76 E7 80    1013498 Ecc_Crct:       Tm      !r7,#Ecc_Correctable
2EEA 6B 2B         13499                 Jr      Z,Ecc_End
2EEC               13500                 
2EEC AC 03        613501                 Ld      !rA,#3  ; J := J DIV 8
2EEE C0 E8        613502 Ecc_Div8:       Rrc     !r8
2EF0 C0 E9        613503                 Rrc     !r9
2EF2 AA FA         13504                 Djnz    !rA,Ecc_Div8
2EF4 56 E8 1F    1013505                 And     !r8,#$1F        ;mask off any unwanted carries
2EF7               13506                 
2EF7 CC 10        613507                 Ld      !rC,#.HIBYTE. RDummy
2EF9 DC 18        613508                 Ld      !rD,#.LOWBYTE. RDummy
2EFB 02 D9        613509                 Add     !rD,!r9
2EFD 12 C8        613510                 Adc     !rC,!r8
2EFF               13511                 
2EFF BC 12        613512                 Ld      !rB,#Wrk_Sys+$02 ;start with R2
2F01 AC 03        613513                 Ld      !rA,#3  ;correct 3 bytes
2F03               13514                 
2F03 82 1C       1213515 Ecc_Crct_Lp:    Lde     !r1,@!!rC
2F05 B3 1B        613516                 Xor     !r1,@!rB
2F07 F3 B1        613517                 Ld      @!rB,!r1
2F09 93 BC       1813518                 Ldei    @!!rC,@!rB
2F0B AA F6         13519                 Djnz    !rA,Ecc_Crct_Lp
2F0D               13520                 
2F0D 2C 20        613521                  Ld     !r2,#.HIBYTE. RBuf_To_Buf2
2F0F 3C 8F        613522                  Ld     !r3,#.LOWBYTE. RBuf_To_Buf2
2F11 D6 04 AB    2013523                 Call    Bank_Call
2F14 76 E7 80    1013524                 Tm      !r7,#Ecc_Correctable ;set correctable flag
2F17               13525                 





        WIDGET.ASSEM            Page 414
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F17 8D 04 F8      13526 Ecc_End:        Jp      Bank_Ret
2F1A               13527                 
2F1A               13528                 .LSTOFF
2F1A               13530                 .LSTON























































        WIDGET.ASSEM            Page 415
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F1A               13531                 .Page
2F1A               13532 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2F1A               13533 ;>
2F1A               13534 ;>      Procedure: ShiftAndXor
2F1A               13535 ;>
2F1A               13536 ;>      This procedure is used to shift the current syndrome bytes
2F1A               13537 ;>      ( assumed to be located in !r1:6 ) to the right 1 bit and then
2F1A               13538 ;>      Xor the syndromes with the reciprocal polynomial if needed.
2F1A               13539 ;>
2F1A               13540 ;>      Inputs:
2F1A               13541 ;>              R1 : BYTE { !r1 }
2F1A               13542 ;>              R2 : BYTE { !r2 }
2F1A               13543 ;>              R3 : BYTE { !r3 }
2F1A               13544 ;>              R4 : BYTE { !r4 }
2F1A               13545 ;>              R5 : BYTE { !r5 }
2F1A               13546 ;>              R6 : BYTE { !r6 }
2F1A               13547 ;>
2F1A               13548 ;>      Outputs:
2F1A               13549 ;>              R1 : BYTE { !r1 }
2F1A               13550 ;>              R2 : BYTE { !r2 }
2F1A               13551 ;>              R3 : BYTE { !r3 }
2F1A               13552 ;>              R4 : BYTE { !r4 }
2F1A               13553 ;>              R5 : BYTE { !r5 }
2F1A               13554 ;>              R6 : BYTE { !r6 }
2F1A               13555 ;>
2F1A               13556 ;>      Algorithm:
2F1A               13557 ;>
2F1A               13558 ;>      BEGIN
2F1A               13559 ;>       Shift the syndromes right 1 bit with carry
2F1A               13560 ;>       IF the lsb of R6 was a 1  { if carry }
2F1A               13561 ;>        THEN
2F1A               13562 ;>              R1 := R1 XOR 140
2F1A               13563 ;>              R2 := R2 XOR 12
2F1A               13564 ;>              R3 := R3 XOR 10
2F1A               13565 ;>              R4 := R4 XOR 40
2F1A               13566 ;>              R5 := R5 XOR 24
2F1A               13567 ;>              R6 := R6 XOR 8
2F1A               13568 ;>
2F1A               13569 ;>      END
2F1A               13570 ;>
2F1A               13571 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2F1A               13572                 .LSTOFF
2F1A               13575                 .LSTON
















        WIDGET.ASSEM            Page 416
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F1A               13576                 .Page
2F1A               13577                 .FIN
2F1A               13578 
2F1A               13579 ShiftAndXor:
2F1A CC 06        613580                 Ld      !rC,#6  ;shift 6 bytes
2F1C DC 11        613581                 Ld      !rD,#Wrk_Sys+$01 ;start with R1
2F1E               13582                 
2F1E CF           613583                 Rcf
2F1F               13584 
2F1F C1 ED        613585 S_A_Xor_Lp:     Rrc     @!rD
2F21 DE           613586                 Inc     !rD
2F22 CA FB         13587                 Djnz    !rC,S_A_Xor_Lp
2F24               13588                 
2F24 FB 12         13589                 Jr      Nc,S_A_Xor_End
2F26               13590                 
2F26 B6 E1 8C    1013591                 Xor     !r1,#140
2F29 B6 E2 0C    1013592                 Xor     !r2,#12
2F2C B6 E3 0A    1013593                 Xor     !r3,#10
2F2F B6 E4 28    1013594                 Xor     !r4,#40
2F32 B6 E5 18    1013595                 Xor     !r5,#24
2F35 B6 E6 08    1013596                 Xor     !r6,#8
2F38               13597                 
2F38 42 11        613598 S_A_Xor_End:    Or      !r1,!r1  ;IF ( R1=0 )...
2F3A AF          1413599                 Ret
2F3B               13600 
2F3B               13601                 .LSTOFF
2F3B               13603                 .LSTON
































        WIDGET.ASSEM            Page 417
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F3B               13604                 .Page
2F3B               13605 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2F3B               13606 ;>
2F3B               13607 ;>      Procedure: TestMod8
2F3B               13608 ;>
2F3B               13609 ;>      This procedure is used to test if ( J MOD 8 = 0 ).
2F3B               13610 ;>
2F3B               13611 ;>      Inputs:
2F3B               13612 ;>              J : WORD { !!r8 }
2F3B               13613 ;>
2F3B               13614 ;>      Outputs: { none }
2F3B               13615 ;>
2F3B               13616 ;>      Scoped Global Variables Changed:
2F3B               13617 ;>              Done : !r7/bit 5
2F3B               13618 ;>              Correctable : !r7/bit 7
2F3B               13619 ;>
2F3B               13620 ;>      Algorithm:
2F3B               13621 ;>
2F3B               13622 ;>      BEGIN
2F3B               13623 ;>       IF ( J MOD 8 = 0 )
2F3B               13624 ;>        THEN
2F3B               13625 ;>              Done := True
2F3B               13626 ;>              Correctable := True
2F3B               13627 ;>      END
2F3B               13628 ;>
2F3B               13629 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2F3B               13630                 .LSTOFF
2F3B               13633                 .LSTON































        WIDGET.ASSEM            Page 418
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F3B               13634                 .Page
2F3B               13635                 .FIN
2F3B               13636 
2F3B               13637 TestMod8:
2F3B 08 E9        613638                 Ld      !r0,!r9
2F3D 56 E0 07    1013639                 And     !r0,#07 ;get remainder from division
2F40 EB 03         13640                 Jr      Nz,TstMd8_Done
2F42               13641                 
2F42 46 E7 A0    1013642                 Or      !r7,#Ecc_Done+Ecc_Correctable
2F45               13643                 
2F45 AF          1413644 TstMd8_Done:    Ret
2F46               13645 
2F46               13646                 .LSTOFF
2F46               13649                 .LSTON













































        WIDGET.ASSEM            Page 419
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F46               13650                 .Page
2F46               13651 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2F46               13652 ;>
2F46               13653 ;>      Procedure: Test0
2F46               13654 ;>
2F46               13655 ;>      This procedure is used to test if ( J = 0 ).
2F46               13656 ;>
2F46               13657 ;>      Inputs:
2F46               13658 ;>              J : WORD { !!r8 }
2F46               13659 ;>
2F46               13660 ;>      Outputs: { none }
2F46               13661 ;>
2F46               13662 ;>      Scoped Global Variables Changed:
2F46               13663 ;>              Done : !r7/bit 5
2F46               13664 ;>              Correctable : !r7/bit 7
2F46               13665 ;>
2F46               13666 ;>      Algorithm:
2F46               13667 ;>
2F46               13668 ;>      BEGIN
2F46               13669 ;>       IF ( J = 0 )
2F46               13670 ;>        THEN
2F46               13671 ;>              Done := True
2F46               13672 ;>              Correctable := True
2F46               13673 ;>      END
2F46               13674 ;>
2F46               13675 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2F46               13676                 .LSTOFF
2F46               13679                 .LSTON































        WIDGET.ASSEM            Page 420
Widget-10: System_Code: Rev:1-A.4.3 Jan 7,1984


2F46               13680                 .Page
2F46               13681                 .FIN
2F46               13682 
2F46               13683 Test0:
2F46 08 E8        613684                 Ld      !r0,!r8
2F48 42 09        613685                 Or      !r0,!r9 ;IF ( J = 0 )..
2F4A EB 06         13686                 Jr      Nz,Tst0_Done
2F4C               13687                 
2F4C 46 E7 20    1013688                 Or      !r7,#Ecc_Done
2F4F 56 E7 7F    1013689                 And     !r7,#$FF-Ecc_Correctable
2F52               13690                 
2F52 AF          1413691 Tst0_Done:      Ret
2F53               13692 
2F53               13693                 .LSTOFF











































