09       .OPT NO LIST
10 ;  SAVE #D1:PERHNDLR.M65
20 ;
30 ;
40 ;  LOAD #D1:SIO.M65
50 ;
60 ;  *= $E739
70       .PAGE "Peripheral Handler"
80        LIST  
90       .LOCAL 
059193 PHR LDA WARMST Per.Hndlr init
059195   BEQ ?POWRUP Go if powerup
059197   LDA # <CHLINK-18 On reset
059199   STA ZCHAIN
059201   LDA # >CHLINK-18
059203   STA ZCHAIN+1
059205 ?59205 LDY #18 Point Chlink
059207   CLC         Check if more
059208   LDA (ZCHAIN),Y handler to
059210   TAX         load
059211   INY 
059212   ADC (ZCHAIN),Y
059214   BEQ ?EXIT1  None
059216   LDA (ZCHAIN),Y Add 18 bytes
059218   STA ZCHAIN+1 from Chlink
059220   STX ZCHAIN  Return complement
059222   JSR ADD18   of sum, c=0 y=$ff
059225   BNE ?EXIT1
059227   JSR ?59540  a=0 y=$ff x=lsb
059230   BCS ?EXIT1
059232   BCC ?59205
059234 ?POWRUP LDA #0
059236   STA CHLINK
059239   STA CHLINK+1
059242   LDA #$4F    Are you there?
059244   BNE ?59291  Always to set dcb
059246 ?59246 LDA #0 Daux1/2 to get
059248   TAY         handler info
059249   JSR POLL.PD Daux1/2=0
059252   BPL ?59255  Flag from sio
059254 ?EXIT1 RTS    No pd
059255 ?59255 CLC    Got a pd
059256   LDA MEMLO
059259   ADC DVSTAT  lsb handler size
059262   STA TEMP1
059265   LDA MEMLO+1
059268   ADC DVSTAT+1 msb
059271   STA TEMP2
059274   SEC 
059275   LDA MEMTOP  Check if under
059278   SBC TEMP1   memtop
059281   LDA MEMTOP+1
059284   SBC TEMP2
059287   BCS ?59298  Yes, ok
059289 ?59289 LDA #$4E Else null poll
059291 ?59291 TAY 
059292   JSR POLL.PD
059295   JMP ?59246
059298 ?59298 LDA DVSTAT+2 sio address
059301   LDX MEMLO
059304   STX DVSTAT+2
059307   LDX MEMLO+1
059310   STX DVSTAT+3
059313   JSR PHDLOD
059316   BMI ?59289
059318   SEC 
059319   JSR L59550
059322   BCS ?59289
059324   BCC ?59246
059326 POLL.PD PHA   Exec poll
059327   LDX #9
059329 ?POLL.2 LDA ?DCBDAT.1,X
059332   STA DDEVIC,X Get 4 bytes
059335   DEX         into dvstat
059336   BPL ?POLL.2
059338   STY DAUX2   Set daux from
059341   PLA         a and y entry
059342   STA DAUX1   values
059345   JMP SIOV
059348 ?DCBDAT.1 .BYTE $4F ddevic
059349   .BYTE 1     dunit
059350   .BYTE $40   dcomnd
059351   .BYTE $40   dstats
059352   .WORD DVSTAT dbuflo/hi
059354   .WORD 30    dtimlo/hi
059356   .WORD 4     dbytlo/hi
059358 PHDLOD STA TEMP2 Load handler
059361   LDX #0      Temp2=sio addr
059363   STX TEMP1
059366   DEX 
059367   STX TEMP3   Temp3=$FF
059370   LDA DVSTAT+2 memlo
059373   ROR A
059374   BCC ?59384  must be even
059376   INC DVSTAT+2
059379   BNE ?59384
059381   INC DVSTAT+3 memlo+1
059384 ?59384 LDA DVSTAT+2 memlo
059387   STA LOADAD
059390   LDA DVSTAT+3 memlo+1
059393   STA LOADAD+1
059396   LDA # <?GET1 Set up
059398   STA GBYTEA  indirect
059401   LDA # >?GET1 subroutine
059403   STA GBYTEA+1
059406   LDA #$80
059408   STA ZLOADA
059411   JMP PDRELOC
059414 ?GET1 LDX TEMP3 Get byte
059417   INX         routine
059418   STX TEMP3
059421   BEQ ?59431
059423 ?59423 LDX TEMP3 Error exit?
059426   LDA ICAX4+$30,X
059429   CLC 
059430   RTS 
059431 ?59431 LDA #$80
059433   STA TEMP3
059436   JSR ?GETBLOCK
059439   BPL ?59423
059441   SEC 
059442   RTS 
059443 ?GETBLOCK LDX #11 Get next
059445 ?BLOCK.2 LDA ?DCBDAT.2,X load
059448   STA DDEVIC,X block
059451   DEX 
059452   BPL ?BLOCK.2
059454   LDX TEMP1   new memlo
059457   STX DAUX1
059460   INX 
059461   STX TEMP1
059464   LDA TEMP2
059467   STA DDEVIC
059470   JMP SIOV
059473 ?DCBDAT.2 .BYTE 0 ddevic
059474   .BYTE 1     dunit
059475   .BYTE '&    dcomnd
059476   .BYTE $40   dstats
059477   .WORD CASBUF dbuflo/hi
059479   .WORD 30    dtimlo/hi
059481   .WORD 128   dbytlo/hi
059483   .WORD 0     daux1/2
059485 ?59485 STY TEMP1 Search
059488   STA TEMP2   handler chain
059491   LDA # <CHLINK-18
059493   STA ZCHAIN
059495   LDA # >CHLINK-18
059497   STA ZCHAIN+1
059499 ?59499 LDY #$12
059501   LDA (ZCHAIN),Y
059503   TAX 
059504   INY 
059505   LDA (ZCHAIN),Y
059507   CMP TEMP2
059510   BNE ?59519
059512   CPX TEMP1
059515   BNE ?59519
059517   CLC 
059518   RTS 
059519 ?59519 CMP #0
059521   BNE ?59529
059523   CPX #0
059525   BNE ?59529
059527 ?59527 SEC 
059528   RTS 
059529 ?59529 STX ZCHAIN
059531   STA ZCHAIN+1
059533   JSR ADD18
059536   BNE ?59527
059538   BEQ ?59499  Always
059540 ?59540 SEC    Handler
059541   PHP         warmstart init
059542   BCS ?59584  Always
059544 PDWARM STA DVSTAT+3 Warmstart
059547   STY DVSTAT+2 with chaining
059550 L59550 PHP    Cold start init
059551   LDA #0
059553   TAY 
059554   JSR ?59485
059557   BCS ?59598
059559   LDY #$12
059561   LDA DVSTAT+2
059564   STA (ZCHAIN),Y
059566   TAX 
059567   INY 
059568   LDA DVSTAT+3
059571   STA (ZCHAIN),Y
059573   STX ZCHAIN
059575   STA ZCHAIN+1
059577   LDA #0
059579   STA (ZCHAIN),Y
059581   DEY 
059582   STA (ZCHAIN),Y
059584 ?59584 JSR ?JINIT Init handler
059587   BCC ?59601  and update memlo
059589   LDA DVSTAT+3
059592   LDY DVSTAT+2
059595   JSR PDUNLINK
059598 ?59598 PLP 
059599   SEC 
059600   RTS 
059601 ?59601 PLP 
059602   BCS ?59613
059604   LDA #0
059606   LDY #$10
059608   STA (ZCHAIN),Y
059610   INY 
059611   STA (ZCHAIN),Y
059613 ?59613 CLC 
059614   LDY #16
059616   LDA MEMLO
059619   ADC (ZCHAIN),Y
059621   STA MEMLO
059624   INY 
059625   LDA MEMLO+1
059628   ADC (ZCHAIN),Y
059630   STA MEMLO+1
059633   LDY #15
059635   LDA #0
059637   STA (ZCHAIN),Y
059639   JSR ADD18
059642   LDY #15
059644   STA (ZCHAIN),Y
059646   CLC 
059647   RTS 
059648 ?JINIT CLC    Init handler
059649   LDA ZCHAIN  Get init address
059651   ADC #12
059653   STA TEMP1
059656   LDA ZCHAIN+1
059658   ADC #0
059660   STA TEMP2
059663   JMP (TEMP1) To handler init
059666   JMP DOSETBV Not ref?
059669 PDUNLINK JSR ?59485 Handler
059672   BCS ?59733  unlinking
059674   TAY 
059675   LDA ZCHAIN
059677   PHA 
059678   LDA ZCHAIN+1
059680   PHA 
059681   STX ZCHAIN
059683   STY ZCHAIN+1
059685   LDA COLDST
059688   BNE ?59705
059690   LDY #16
059692   CLC 
059693   LDA (ZCHAIN),Y
059695   INY 
059696   ADC (ZCHAIN),Y
059698   BNE ?59731
059700   JSR ADD18
059703   BNE ?59731
059705 ?59705 LDY #$12
059707   LDA (ZCHAIN),Y
059709   TAX 
059710   INY 
059711   LDA (ZCHAIN),Y
059713   TAY 
059714   PLA 
059715   STA ZCHAIN+1
059717   PLA 
059718   STA ZCHAIN
059720   TYA 
059721   LDY #$13
059723   STA (ZCHAIN),Y
059725   DEY 
059726   TXA 
059727   STA (ZCHAIN),Y
059729   CLC 
059730   RTS 
059731 ?59731 PLA 
059732   PLA 
059733 ?59733 SEC 
059734   RTS 
059735   .BYTE 0     Following was 800
059736   .BYTE 0     entry to Sioutl
059737   JMP SIOUTL  Not referenced
