Ln SOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: ¤xШ©wЌЯяўыљ,А©@ЌКя©ЌпяўОпяЋ ­ Рх©…а©…б©……©ў…† ѕЎжа©…жж†ж†жж ѕЎ ±……аИ±……бРкҐаРж­l …в­m …гҐгi…е8Ґвн#¤…дҐей…е ±в)Н Р!Ё±вЩ Р€Рц ±в)рO^F¬X¬яяяяяяяя A°!гd¬&)SCAN.TEXTћ A° г*­8*SHELL.TEXT©A° г­ /TEST.ONOFF.TEXT®A° гН¬ -TYPE.203.TEXTі A° г,­; )TYPE.TEXTѕ A°!г,­; .ZPCOMMENT.TEXTЙ A°!гl¬% -ZPCOMMON.TEXTТ A°г,­ -REMO.100.TEXT:A°гѓ­: -REMO.101.TEXTI A°гѓ­+-REMO.102.TEXTZ$A°гѓ­-REMO.103.TEXTm$A°гѓ­/)REMO.TEXTЂ$A°гѓ­/-SCAN.201.TEXT“ A°г*­)ъIII.SRC.030.CuГ' )BUK2.TEXTA°г­ )BUK4.TEXT A°г­ )BUK6.TEXT A°г­ )BUK8.TEXT A°г­ -QMON.205.TEXT A°г,­ )QMON.TEXT-Й р>Йрр®d  LФЎҐвm#¤…вҐгi…гҐдЕвҐеег°јҐдm#¤…вҐеi…гЖжР•®O  LФЎ ±в…аИ±в…б­f ……­g …† ѕЎ­h ……­i …†­ …а­ …б ѕЎўЅЭ! р®d  LФЎКн©…зжзж†ж†¦зЅ …аЅ …бҐаРҐбр ѕЎLЉЎ­j m…и­k m …йlи©…‡Ґа¦б yф°`®2   LФЎ„з8©(езJeзЁЅ) ™§К€ЖзРф­@АLпЎ .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : Bucket04 Cmd Key: n.a. ; ; Date : 08/04/86 Version : 2.00 Name Code : BU04 ; ; Description : 4K space for dyna O^F¬X¬ock 100,0da (  end .end ;module name  entry rts ( ;17 bytes (x'11) to here ( (.block 0ef,0da (.block 100,0da (.block 100,0da (.block 100,0da ;1K to here ( (.block 100,0da (.block 100,0da (.block 100,0da (.blmic loading ; ;----------------------------------------------------------------- ( start jmp entry .ascii "2" ; no command key .word start-1 .word end-start .ascii "Bucket02" .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : Bucket02 Cmd Key: n.a. ; ; Date : 08/04/86 Version : 2.00 Name Code : BU02 ; ; Description : 2K space for dynamic loading ; ;----------------------------------------------------------------- ( start jmp entry .ascii "4" ; no command key .word start-1 .word end-start .ascii "Bucket04" ;module name  entry rts ( ;17 bytes (x'11) to here ( (.block 0ef,0da (.block 100,0da (.block 100,0da (.block 100,0da ;1K to here ( (.block 100,0da (.block 100,0da (.block 100,0da (.bl(.block 100,0da ;5K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;6K   end .end ock 100,0da ;2K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;3K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;4K (.block 100,0da (.block 100,0da (.block 100,0da ;module name  entry rts ( ;17 bytes (x'11) to here ( (.block 0ef,0da (.block 100,0da (.block 100,0da (.block 100,0da ;1K to here ( (.block 100,0da (.block 100,0da (.block 100,0da (.blmic loading ; ;----------------------------------------------------------------- ( start jmp entry .ascii "6" ; no command key .word start-1 .word end-start .ascii "Bucket06" .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : Bucket06 Cmd Key: n.a. ; ; Date : 08/04/86 Version : 2.00 Name Code : BU06 ; ; Description : 6K space for dynaO^F¬X¬ock 100,0da ;2K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;3K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;4K (  end .end O^F¬X¬O^F¬Й¬,0da (.block 100,0da ;8K   end .end (.block 100,0da ;5K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;6K  (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;7K ( (.block 100,0da (.block 100,0da (.block 100ock 100,0da ;2K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;3K ( (.block 100,0da (.block 100,0da (.block 100,0da (.block 100,0da ;4K (.block 100,0da (.block 100,0da (.block 100,0da ;module name  entry rts ( ;17 bytes (x'11) to here ( (.block 0ef,0da (.block 100,0da (.block 100,0da (.block 100,0da ;1K to here ( (.block 100,0da (.block 100,0da (.block 100,0da (.blmic loading ; ;----------------------------------------------------------------- ( start jmp entry .ascii "8" ; no command key .word start-1 .word end-start .ascii "Bucket08" .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : Bucket08 Cmd Key: n.a. ; ; Date : 08/04/86 Version : 2.00 Name Code : BU08 ; ; Description : 8K space for dyna!"#$%&'()*+ 0ldy #0 ; move page 3 to page 1A $2 lda MONZPG,Y sta USERZPG,Y iny bne $2 0lda #73 ZPG+68 ; ??? ora #40 sta MONZPG+68 ora #7F and #0A0 sta MONZPG+66 sta MONZPG+67 $007 sta 1600,x ;clear out xbytes 0inx 0bne $007 0 0ldx #0f $010 lda 1900,x 0sta s_1900,x 0lda x1900_stuff,x 0sta 1900,x 0dex 0bpl $010 0 lda MONro page $005 lda 1600,x 0sta s_1600,x 0lda 1a00,x 0sta s_1a00,x 0lda 1b00,x 0sta s_1b00,x 0lda 1e00,x 0sta s_1e00,x 0lda 1f00,x 0sta s_1f00,x 0inx 0bne $005 0 0txa php 0plp 0sta s_pstat 0sei 0tsx 0stx s_stack save_em moveb monzpg+66,s_m66 0moveb monzpg+67,s_m67 0moveb monzpg+68,s_m68 0moveb b_reg,s_breg 0moveb e_reg,s_ereg 0 ldx #00 ;save ze ;normal vid 0.byte 0ff p_start_msg .word start_msg  entry 0CALL m_msg0,p_init_msg 0CALL m_get_char 0and #5c 0cmp #"X" 0bne do_it 0rts  do_it CALL m_msg,p_start_msg 0 p_init_msg .word init_msg  start_msg .byte 1c,1a,00,12,12 ;clear inverse 0.ascii "Entering Monitor...Type 1900J to EXIT" 0.byte 0d 0.ascii "512 bytes from 1E00-1FFF available for I/O buffer" 0.byte 11 .equ 0300 MONENTRY .equ 0F901 ; ; Interpreter Header ; ; init_msg .byte 12 0.ascii "Press Any Key to enter MONITOR... X to quit now" 0.byte 11 0.byte 0ff key for module .word start-1 .word end-start .ascii "QuikMon "  ; Interpreter Monitor Source Code ; ; 0 ENVIRON .equ 0FFDF USERZPG .equ 1A00 MONZPG ystem monitor ; ;----------------------------------------------------------------- ( (.include zpcommon (.include pkymacs (.include callmacs  ( start jmp entry .ascii "Z" ;command .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : QuikMon Cmd Key: (Z)ap ; ; Date : 09/11/86 Version : 2.05 Name Code : QMON ; ; Description : Enters Apple /// s ; set environment sta ENVIRON jmp MONENTRY ; jump to monitor ;---------------------------------------------------- ; ; following is copied into 1900-190f to facilitate 1900J exit ; ;----------------------------------------------------  s_ereg .equ *+1 s_breg .equ *+6 x1900_stuff lda #00 0sta e_reg 0lda #00 0sta b_reg 0jmp wrap 0 0.block 3,0da ;fill to 16 bytes ;---- .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : QuikMon Cmd Key: (Z)ap ; ; Date : 09/11/86 Version : 2.05 Name Code : QMON ; ; Description : Enters Apple /// s,./012345678O^F¬Й¬s_stack .byte 00  s_1900 .block 10,0 s_1600 .block 100,0 s_1a00 .block 100,0 s_1b00 .block 100,0 s_1e00 .block 100,0 s_1f00 .block 100,0   end .end 66,monzpg+66 0moveb s_m67,monzpg+67 0moveb s_m68,monzpg+68 0 0ldx s_stack 0txs 0lda s_pstat 0pha 0plp 0 0rts 0 0  s_m66 .byte 00 s_m67 .byte 00 s_m68 .byte 00 s_pstat .byte 00 a00,x 0sta 1a00,x 0lda s_1b00,x 0sta 1b00,x 0lda s_1e00,x 0sta 1e00,x 0lda s_1f00,x 0sta 1f00,x 0inx 0bne $005 0 0ldx #0f $010 lda s_1900,x 0sta 1900,x 0dex 0bpl $010 0 0moveb s_m------------------------------------------------- ; ; the 1900 routine jumps to here to clean up & exit ; ;-----------------------------------------------------  wrap ldx #00 $005 lda s_1600,x 0sta 1600,x 0lda s_1ystem monitor ; ;----------------------------------------------------------------- ( (.include zpcommon (.include pkymacs (.include callmacs  ( start jmp entry .ascii "Z" ;command key for module .word start-1 .word end-start .ascii "QuikMon "  ; Interpreter Monitor Source Code ; ; 0 ENVIRON .equ 0FFDF USERZPG .equ 1A00 MONZPG s_stack .byte 00  s_1900 .block 10,0 s_1600 .block 100,0 s_1a00 .block 100,0 s_1b00 .block 100,0 s_1e00 .block 100,0 s_1f00 .block 100,0   end .end 66,monzpg+66 0moveb s_m67,monzpg+67 0moveb s_m68,monzpg+68 0 0ldx s_stack 0txs 0lda s_pstat 0pha 0plp 0 0rts 0 0  s_m66 .byte 00 s_m67 .byte 00 s_m68 .byte 00 s_pstat .byte 00 a00,x 0sta 1a00,x 0lda s_1b00,x 0sta 1b00,x 0lda s_1e00,x 0sta 1e00,x 0lda s_1f00,x 0sta 1f00,x 0inx 0bne $005 0 0ldx #0f $010 lda s_1900,x 0sta 1900,x 0dex 0bpl $010 0 0moveb s_m------------------------------------------------- ; ; the 1900 routine jumps to here to clean up & exit ; ;-----------------------------------------------------  wrap ldx #00 $005 lda s_1600,x 0sta 1600,x 0lda s_1;----------------------------------------------------  s_ereg .equ *+1 s_breg .equ *+6 x1900_stuff lda #00 0sta e_reg 0lda #00 0sta b_reg 0jmp wrap 0 0.block 3,0da ;fill to 16 bytes ;---- ; set environment sta ENVIRON jmp MONENTRY ; jump to monitor ;---------------------------------------------------- ; ; following is copied into 1900-190f to facilitate 1900J exit ; 0ldy #0 ; move page 3 to page 1A $2 lda MONZPG,Y sta USERZPG,Y iny bne $2 0lda #73 ZPG+68 ; ??? ora #40 sta MONZPG+68 ora #7F and #0A0 sta MONZPG+66 sta MONZPG+67 $007 sta 1600,x ;clear out xbytes 0inx 0bne $007 0 0ldx #0f $010 lda 1900,x 0sta s_1900,x 0lda x1900_stuff,x 0sta 1900,x 0dex 0bpl $010 0 lda MONro page $005 lda 1600,x 0sta s_1600,x 0lda 1a00,x 0sta s_1a00,x 0lda 1b00,x 0sta s_1b00,x 0lda 1e00,x 0sta s_1e00,x 0lda 1f00,x 0sta s_1f00,x 0inx 0bne $005 0 0txa php 0plp 0sta s_pstat 0sei 0tsx 0stx s_stack save_em moveb monzpg+66,s_m66 0moveb monzpg+67,s_m67 0moveb monzpg+68,s_m68 0moveb b_reg,s_breg 0moveb e_reg,s_ereg 0 ldx #00 ;save ze ;normal vid 0.byte 0ff p_start_msg .word start_msg  entry 0CALL m_msg0,p_init_msg 0CALL m_get_char 0and #5c 0cmp #"X" 0bne do_it 0rts  do_it CALL m_msg,p_start_msg 0 p_init_msg .word init_msg  start_msg .byte 1c,1a,00,12,12 ;clear inverse 0.ascii "Entering Monitor...Type 1900J to EXIT" 0.byte 0d 0.ascii "512 bytes from 1E00-1FFF available for I/O buffer" 0.byte 11 .equ 0300 MONENTRY .equ 0F901 ; ; Interpreter Header ; ; init_msg .byte 12 0.ascii "Press Any Key to enter MONITOR... X to quit now" 0.byte 11 0.byte 0ff .byte 08 0.ascii ".CONSOLE"  p_co_name .word co_name ;in the dcb   rs_name .byte 06 0.ascii ".RS232" p_rs_name .word rs_name ;in the dcb co_dnum .byte 00 rs_dnum .byte 00 last_rb .byte 00  p_my_co_handler .word my_co_handler-1 p_my_rs_handler .word my_rs_handler-1   init_flag .byte 00 ;00=no init yet, 80=init done  hook_flag .byte 00 ;00=no hookup, 80=hookup   co_name  ; ****** data areas ******* on_off_msg .ascii "REMO> Do you wish to turn Remote/// ON (Y/N) ?" 0.byte 0ff p_onoff_msg .word on_off_msg  sv_co_entry .word 0000 sv_co_ent_xb .byte 00 sv_rs_entry .word 0000 sv_rs_ent_x .equ 18C0  read_req .equ 00 write_req .equ 01 repeat_req .equ 09 sdt .equ 0EED9 sdt_adrl .equ sdt+1+19+19 sdt_adrh .equ sdt_adrl+19 sdt_bnk .equ sdt_adrh+19  .ascii "R" ;command key for module .word start-1 .word end-start .ascii "Remote3 " ;module name  ; ****** equates *******  patch_area .equ 19A0 req_code SOLE ; ;----------------------------------------------------------------- debug .equ 80 0 0.nolist (.include zpcommon (.include pkymacs (.include callmacs 0.list 0.nopatchlist 0.nomacrolist ( start jmp entry .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : REMOTE/// Cmd Key: GR ; ; Date : 12/03/86 Version : 1.00 Name Code : REMO ; ; Description : Hooks .RS232 to .CON9;<=>?@ABCDEFG 1 2 DATA ENTRY 3 4 EQUATE MAIN EQUATES ™™ц™™Н™НO^F¬<¬eq .byte 00  ;****** entry ******** ( (dbstr "entry" (  entry (lda init_flag (bmi $005 (jsr do_init $005 jsr query_on_off (and #5f (cmp #"Y" (bne $010 (jmp turn_on  $010 jmp turn_off  ;------------------------------------------------------------- ; do_init ::: ; ; find the .console and .rs232 handlers in sdt plug them into our code ; then change the .console handler to point into my_cons_handler in this st_req 0cmp #write_req 0bne $020 0jmp do_write 0 $020 cmp #read_req 0bne $090 0jmp do_read $090 jsr do_co_actual 0rts ;------------------------------------------------------------ 0dbstr 0lda hook_flag 0beq $090 0 $005 lda req_code 0cmp #repeat_req 0bne $010 0lda last_req 0sta req_code 0 $010 sta lars_what lda #00 0sta breg rs_here jsr rs_here rs_whatx lda #00 0sta breg 0rts ;----------------------------------------------------------------  dbstr "my_co_handler"  my_co_handler / 0rts ;locate at non-switched area (1990) then jsr to it for rs actual ; 0dbstr "do_rs_actual"  do_rs_actual ldx #10 $01 lda x_rs_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts  x_rs_actual ldx #10 $01 lda x_co_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts 0  x_co_actual co_what lda #00 0sta breg co_here jsr co_here co_whatx lda #00 0sta breg rs_here+1 0lda sv_rs_entry+1 0adc #00 0sta rs_here+2 0 0lda breg 0sta co_whatx+1 0sta rs_whatx+1 0rts 0 ;locate at non-switched area (1990) then jsr to it for co actual ; 0dbstr "do_co_actual" 0  do_co_actual wrap_init moveb sv_co_ent_xb,co_what+1 0moveb sv_rs_ent_xb,rs_what+1 0 0clc 0lda sv_co_entry 0adc #01 0sta co_here+1 0lda sv_co_entry+1 0adc #00 0sta co_here+2 0 0 0clc 0lda sv_rs_entry 0adc #01 0sta0;sta sdt_adrl,x 0 0lda sdt_adrh,x 0sta sv_rs_entry+1 0;lda p_my_rs_handler+1 0;sta sdt_adrh,x 0 0lda sdt_bnk,x 0sta sv_rs_ent_xb 0;lda breg 0;sta sdt_bnk,x  0dbstr "wrap_init" 0 andler+1 0sta sdt_adrh,x 0 0lda sdt_bnk,x 0sta sv_co_ent_xb 0lda breg 0sta sdt_bnk,x get_rs_info ;for now we won't trap rs device calls 0ldx rs_dnum 0lda sdt_adrl,x 0sta sv_rs_entry 0;lda p_my_rs_handler dnum ERROR   0dbstr "get_sdt_stuff" get_sdt_stuff get_set_co_info 0ldx co_dnum 0lda sdt_adrl,x 0sta sv_co_entry 0lda p_my_co_handler 0sta sdt_adrl,x 0 0lda sdt_adrh,x 0sta sv_co_entry+1 0lda p_my_co_h0moveb dnum,rs_dnum 0rts   gdnum_parms .byte 02  gdnum_name .word 0000 dnum .byte 00  get_dnum brk 0.byte 084 0.word gdnum_parms 0bne err 0rts   err rts ;get hook_flag 0rts turn_off lda #000 0sta hook_flag 0rts 0  0dbstr "get_dnums" get_dnums 0movew p_co_name,gdnum_name 0jsr get_dnum 0moveb dnum,co_dnum 0 0movew p_rs_name,gdnum_name 0jsr get_dnum 0dbstr "do init"  do_init 0jsr get_dnums 0jsr get_sdt_stuff 0jsr wrap_init 0lda #080 0sta init_flag 0rts  query_on_off 0CALL m_msg0,p_onoff_msg 0CALL m_get_char 0rts  turn_on lda #080 0sta code ; ; my_cons_handler will check for read or write (and manage repeat) ; if its a read then do a read of .rs232 instead ; if its a write then do a write of .rs232 instead ; ;-------------------------------------------------------------- "do_write" do_write 0jsr do_rs_actual 0rts 0 ;---------------------------------------------------------- 0dbstr "do_read" 0 do_read jsr do_rs_actual 0rts my_rs_handler rts 0 0  end .end  1 2 DATA ENTRY 3 4 EQUATE MAIN EQUATES ѕѕ]‰ѕѕ4ѕ4O^F¬<¬(jsr do_init $005 jsr query_on_off (and #5f (cmp #"Y" (bne $010 (jmp turn_on  $010 jmp turn_off  ;------------------------------------------------------------- ; do_init ::: ; ; find the .console and .rs232 hand232X " p_rs_name .word rs_name ;in the dcb co_dnum .byte 00 rs_dnum .byte 00 last_req .byte 00  ;****** entry ******** ( (dbstr "entry" (  entry (lda init_flag (bmi $005 ;00=no init yet, 80=init done  hook_flag .byte 00 ;00=no hookup, 80=hookup   co_name .byte 08 0.ascii ".CONSOLE "  p_co_name .word co_name ;in the dcb   rs_name .byte 07 0.ascii ".RS on_off_msg  sv_co_entry .word 0000 sv_co_ent_xb .byte 00 sv_rs_entry .word 0000 sv_rs_ent_xb .byte 00  p_my_co_handler .word my_co_handler-1 p_my_rs_handler .word my_rs_handler-1   init_flag .byte 00 sdt_adrl .equ sdt+1+19+19 sdt_adrh .equ sdt_adrl+19 sdt_bnk .equ sdt_adrh+19   ; ****** data areas ******* on_off_msg .ascii "REMO> Do you wish to turn Remote/// ON (Y/N) ?" 0.byte 0ff p_onoff_msg .word ;module name  ; ****** equates *******  patch_area .equ 19A0 req_code .equ 18C0  read_req .equ 00 write_req .equ 01 repeat_req .equ 09 sdt .equ 0EED9 kymacs (.include callmacs 0.list 0.nopatchlist 0.nomacrolist ( start jmp entry .ascii "R" ;command key for module .word start-1 .word end-start .ascii "Remote3 " SOLE ; ; 1.01 added open/close of .RS232 to turn on/off ; disable ints for setup ;----------------------------------------------------------------- debug .equ 80 0 0.nolist (.include zpcommon (.include p .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : REMOTE/// Cmd Key: GR ; ; Date : 12/03/86 Version : 1.01 Name Code : REMO ; ; Description : Hooks .RS232 to .CONHJKLMNOPQRSTUVWXlers in sdt plug them into our code ; then change the .console handler to point into my_cons_handler in this code ; ; my_cons_handler will check for read or write (and manage repeat) ; if its a read then do a read of .rs232 instead ; if its a write then do a write of .rs232 instead ; ;-------------------------------------------------------------- 0dbstr "do init"  do_init 0jsr get_dnums 0jsr get_sdt_stuff 0jsr wrap_init 0lda #080 0sta init_flag 0rts  open_rs232 .byte 00 0.byte 0c8 0.word open_parms 0moveb op_refnum,cl_refnum 0rts  close_rs232 .byte 00 0.byte 0cc 0.word close_parms 0rts  open_parms .byte 04 0.word rs_name op_refnum .byte 00 0.word 0---- 0dbstr "do_write" do_write 0jsr do_rs_actual 0rts 0 ;---------------------------------------------------------- 0dbstr "do_read" 0 do_read jsr do_rs_actual 0rts my_rs_handler rts 0 0dbstr "open/close rs232" sta last_req 0cmp #write_req 0bne $020 0jmp do_write 0 $020 cmp #read_req 0bne $090 0jmp do_read $090 jsr do_co_actual 0rts ;--------------------------------------------------------handler / 0lda hook_flag 0beq $090 0 $005 lda req_code 0cmp #repeat_req 0bne $010 0lda last_req 0sta req_code 0 $010  x_rs_actual rs_what lda #00 0sta breg rs_here jsr rs_here rs_whatx lda #00 0sta breg 0rts ;----------------------------------------------------------------  dbstr "my_co_handler"  my_co_reg 0rts ;locate at non-switched area (1990) then jsr to it for rs actual ; 0dbstr "do_rs_actual"  do_rs_actual ldx #10 $01 lda x_rs_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts ldx #10 $01 lda x_co_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts 0  x_co_actual co_what lda #00 0sta breg co_here jsr co_here co_whatx lda #00 0sta bsta rs_here+1 0lda sv_rs_entry+1 0adc #00 0sta rs_here+2 0 0lda breg 0sta co_whatx+1 0sta rs_whatx+1 0rts 0 ;locate at non-switched area (1990) then jsr to it for co actual ; 0dbstr "do_co_actual" 0  do_co_actual0 wrap_init moveb sv_co_ent_xb,co_what+1 0moveb sv_rs_ent_xb,rs_what+1 0 0clc 0lda sv_co_entry 0adc #01 0sta co_here+1 0lda sv_co_entry+1 0adc #00 0sta co_here+2 0 0 0clc 0lda sv_rs_entry 0adc #01 0x get_rs_info ;for now we won't trap rs device calls 0ldx rs_dnum 0lda sdt_adrl,x 0sta sv_rs_entry 0 0lda sdt_adrh,x 0sta sv_rs_entry+1 0 0lda sdt_bnk,x 0sta sv_rs_ent_xb  0plp 0rts  0dbstr "wrap_init" sdt_adrl,x 0sta sv_co_entry 0lda p_my_co_handler 0sta sdt_adrl,x 0 0lda sdt_adrh,x 0sta sv_co_entry+1 0lda p_my_co_handler+1 0sta sdt_adrh,x 0 0lda sdt_bnk,x 0sta sv_co_ent_xb 0lda breg 0sta sdt_bnk, get_dnum brk 0.byte 084 0.word gdnum_parms 0bne err 0rts   err rts ;get dnum ERROR   0dbstr "get_sdt_stuff" get_sdt_stuff 0php 0sei get_set_co_info 0ldx co_dnum 0lda get_dnums 0movew p_co_name,gdnum_name 0jsr get_dnum 0moveb dnum,co_dnum 0 0movew p_rs_name,gdnum_name 0jsr get_dnum 0moveb dnum,rs_dnum 0rts   gdnum_parms .byte 02  gdnum_name .word 0000 dnum .byte 00 query_on_off 0CALL m_msg0,p_onoff_msg 0CALL m_get_char 0rts  turn_on jsr open_rs232 0lda #080 0sta hook_flag 0rts turn_off lda #000 0sta hook_flag 0jsr close_rs232 0rts 0  0dbstr "get_dnums" 000 ;ignored 0.byte 00 ;ignored  close_parms .byte 01 cl_refnum .byte 00 0  end .end rs_handler-1   init_flag .byte 00 ;00=no init yet, 80=init done  hook_flag .byte 00 ;00=no hookup, 80=hookup   co_name .byte 08 0.ascii ".CONSOLE "  p_co_name .word co_name te/// ON (Y/N) ?" 0.byte 0ff p_onoff_msg .word on_off_msg  sv_co_entry .word 0000 sv_co_ent_xb .byte 00 sv_rs_entry .word 0000 sv_rs_ent_xb .byte 00  p_my_co_handler .word my_co_handler-1 p_my_rs_handler .word my_repeat_req .equ 09 sdt .equ 0EED9 sdt_adrl .equ sdt+1+19+19 sdt_adrh .equ sdt_adrl+19 sdt_bnk .equ sdt_adrh+19   ; ****** data areas ******* on_off_msg .ascii "REMO> Do you wish to turn Remod start-1 .word end-start .ascii "Remote3 " ;module name  ; ****** equates *******  patch_area .equ 19A0 req_code .equ 18C0  read_req .equ 00 write_req .equ 01 qu 80 0 0.nolist (.include zpcommon (.include pkymacs (.include callmacs 0.list 0.nopatchlist 0.nomacrolist ( start jmp entry .ascii "R" ;command key for module .worSOLE ; ; 1.02 added set newline for rs232 on open and debug stuff ; 1.01 added open/close of .RS232 to turn on/off ; disable ints for setup ;----------------------------------------------------------------- debug .e .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : REMOTE/// Cmd Key: GR ; ; Date : 12/03/86 Version : 1.02 Name Code : REMO ; ; Description : Hooks .RS232 to .CONY[\]^_`abcdefghijk 1 2 DATA ENTRY 3 4 EQUATE MAIN EQUATES aaЎНaaxaxO^F¬<¬;in the dcb   rs_name .byte 07 0.ascii ".RS232X " p_rs_name .word rs_name ;in the dcb co_dnum .byte 00 rs_dnum .byte 00 last_req .byte 00  ;****** entry ******** ( (dbstr "entry" (  entry (lda init_flag (bmi $005 (jsr do_init $005 jsr query_on_off (and #5f (cmp #"Y" (bne $010 (jmp turn_on  $010 jmp turn_off  ;------------------------------------------------- jsr rs_here rs_whatx lda #00 0sta breg 0rts ;----------------------------------------------------------------  dbstr "my_co_handler"  my_co_handler / 0lda hook_flag 0beq $090 0 $005 r to it for rs actual ; 0dbstr "do_rs_actual"  do_rs_actual ldx #10 $01 lda x_rs_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts  x_rs_actual rs_what lda #00 0sta breg rs_here 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts 0  x_co_actual co_what lda #00 0sta breg co_here jsr co_here co_whatx lda #00 0sta breg 0rts ;locate at non-switched area (1990) then js_here+2 0 0lda breg 0sta co_whatx+1 0sta rs_whatx+1 0rts 0 ;locate at non-switched area (1990) then jsr to it for co actual ; 0dbstr "do_co_actual" 0  do_co_actual ldx #10 $01 lda x_co_actual,x t_xb,rs_what+1 0 0clc 0lda sv_co_entry 0adc #01 0sta co_here+1 0lda sv_co_entry+1 0adc #00 0sta co_here+2 0 0 0clc 0lda sv_rs_entry 0adc #01 0sta rs_here+1 0lda sv_rs_entry+1 0adc #00 0sta rs rs_dnum 0lda sdt_adrl,x 0sta sv_rs_entry 0 0lda sdt_adrh,x 0sta sv_rs_entry+1 0 0lda sdt_bnk,x 0sta sv_rs_ent_xb  0plp 0rts  0dbstr "wrap_init" 0 wrap_init moveb sv_co_ent_xb,co_what+1 0moveb sv_rs_en0lda p_my_co_handler+1 0sta sdt_adrh,x 0 0.if debug 0sta db_02 0stx db_03 0.endc 0 0 0lda sdt_bnk,x 0sta sv_co_ent_xb 0lda breg 0sta sdt_bnk,x get_rs_info ;for now we won't trap rs device calls 0ldx ug 0moveb #0da,in_flag 0.endc 0ldx co_dnum 0lda sdt_adrl,x 0sta sv_co_entry 0lda p_my_co_handler 0sta sdt_adrl,x 0 0.if debug 0sta db_00 0stx db_01 0.endc 0 0lda sdt_adrh,x 0sta sv_co_entry+1  0dbstr "get_sdt_stuff" 0 0.if debug in_flag .byte 00 db_00 .byte 00 db_01 .byte 00 db_02 .byte 00 db_03 .byte 00 0.endc 0 get_sdt_stuff 0php 0sei get_set_co_info 0.if deb,rs_dnum 0rts   gdnum_parms .byte 02  gdnum_name .word 0000 dnum .byte 00  get_dnum brk 0.byte 084 0.word gdnum_parms 0bne err 0rts   err rts ;get dnum ERROR  turn_off lda #000 0sta hook_flag 0jsr close_rs232 0rts 0  0dbstr "get_dnums" get_dnums 0movew p_co_name,gdnum_name 0jsr get_dnum 0moveb dnum,co_dnum 0 0movew p_rs_name,gdnum_name 0jsr get_dnum 0moveb dnum0jsr wrap_init 0lda #080 0sta init_flag 0rts  query_on_off 0CALL m_msg0,p_onoff_msg 0CALL m_get_char 0rts  turn_on jsr open_rs232 0jsr set_newline 0lda #080 0sta hook_flag 0rts if its a read then do a read of .rs232 instead ; if its a write then do a write of .rs232 instead ; ;-------------------------------------------------------------- 0dbstr "do init"  do_init 0jsr get_dnums 0jsr get_sdt_stuff ------------ ; do_init ::: ; ; find the .console and .rs232 handlers in sdt plug them into our code ; then change the .console handler to point into my_cons_handler in this code ; ; my_cons_handler will check for read or write (and manage repeat) ; lda req_code 0cmp #repeat_req 0bne $010 0lda last_req 0sta req_code 0 $010 sta last_req 0cmp #write_req 0bne $020 0jmp do_write 0 $020 cmp #read_req 0bne $090 0jmp do_read $090 jsr do_co_actual 0rts ;------------------------------------------------------------ 0dbstr "do_write" do_write 0jsr do_rs .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : REMOTE/// Cmd Key: GR ; ; Date : 12/03/86 Version : 1.03 Name Code : REMO ; ; Description : Hooks .RS232 to .CONlnopqrstuvwxyz{|}~ 1 2 DATA ENTRY 3 4 EQUATE MAIN EQUATES <<а&<<·<·O^F¬<¬set_nl_dnum .byte 00 0.byte 02 ;stat 02 is set newline 0.word set_nl_list  set_nl_list .byte 80 0.byte 0d   end .end 0rts  open_parms .byte 04 0.word rs_name op_refnum .byte 00 0.word 0000 ;ignored 0.byte 00 ;ignored  close_parms .byte 01 cl_refnum .byte 00 0 set_nl_parms .byte 03 s 0moveb op_refnum,cl_refnum 0rts  close_rs232 .byte 00 0.byte 0cc 0.word close_parms 0rts  set_newline ;d_control #2 for rs232 0moveb rs_dnum,set_nl_dnum 0.byte 00 0.byte 083 0.word set_nl_parms_actual 0rts 0 ;---------------------------------------------------------- 0dbstr "do_read" 0 do_read jsr do_rs_actual 0rts my_rs_handler rts 0 0dbstr "open/close rs232" open_rs232 .byte 00 0.byte 0c8 0.word open_parmSOLE ; ; 1.03 added code to un-write-protect top mem at init ; 1.02 added set newline for rs232 on open and debug stuff ; 1.01 added open/close of .RS232 to turn on/off ; disable ints for setup ;----------------------------------------------------------------- debug .equ 80 0 0.nolist (.include zpcommon (.include pkymacs (.include callmacs 0.list 0.nopatchlist 0.nomacrolist ( start jmp entry .ascii "R" 0.endc 0ldx co_dnum 0lda sdt_adrl,x 0sta sv_co_entry 0lda p_my_co_handler 0sta sdt_adrl,x 0 0.if debug 0sta db_00 0stx db_01 0.endc 0 0lda sdt_adrh,x 0sta sv_co_entry+1 0lda p_my_co_handler+1 0staf" 0 0.if debug in_flag .byte 00 db_00 .byte 00 db_01 .byte 00 db_02 .byte 00 db_03 .byte 00 0.endc 0 get_sdt_stuff 0php 0sei get_set_co_info 0.if debug 0moveb #0da,in_flag s .byte 02  gdnum_name .word 0000 dnum .byte 00  get_dnum brk 0.byte 084 0.word gdnum_parms 0bne err 0rts   err rts ;get dnum ERROR   0dbstr "get_sdt_stuf0sta hook_flag 0jsr close_rs232 0rts 0  0dbstr "get_dnums" get_dnums 0movew p_co_name,gdnum_name 0jsr get_dnum 0moveb dnum,co_dnum 0 0movew p_rs_name,gdnum_name 0jsr get_dnum 0moveb dnum,rs_dnum 0rts   gdnum_parm0sta init_flag 0 0moveb sv_ereg,ereg 0rts  query_on_off 0CALL m_msg0,p_onoff_msg 0CALL m_get_char 0rts  turn_on jsr open_rs232 0jsr set_newline 0lda #080 0sta hook_flag 0rts turn_off lda #000 ----------- 0dbstr "do init"  do_init 0moveb ereg,sv_ereg 0and #0f7 ;unwrite protect top 0sta ereg 0 0jsr get_dnums 0jsr get_sdt_stuff 0jsr wrap_init 0lda #080 andler in this code ; ; my_cons_handler will check for read or write (and manage repeat) ; if its a read then do a read of .rs232 instead ; if its a write then do a write of .rs232 instead ; ;---------------------------------------------------mp turn_on  $010 jmp turn_off  ;------------------------------------------------------------- ; do_init ::: ; ; find the .console and .rs232 handlers in sdt plug them into our code ; then change the .console handler to point into my_cons_hrs_dnum .byte 00 last_req .byte 00  ;****** entry ******** ( (dbstr "entry" (  entry (lda init_flag (bmi $005 (jsr do_init $005 jsr query_on_off (and #5f (cmp #"Y" (bne $010 (j .byte 08 0.ascii ".CONSOLE "  p_co_name .word co_name ;in the dcb   rs_name .byte 07 0.ascii ".RS232X " p_rs_name .word rs_name ;in the dcb co_dnum .byte 00 .byte 00  p_my_co_handler .word my_co_handler-1 p_my_rs_handler .word my_rs_handler-1   init_flag .byte 00 ;00=no init yet, 80=init done  hook_flag .byte 00 ;00=no hookup, 80=hookup   co_name sv_ereg .byte 00 on_off_msg .ascii "REMO> Do you wish to turn Remote/// ON (Y/N) ?" 0.byte 0ff p_onoff_msg .word on_off_msg  sv_co_entry .word 0000 sv_co_ent_xb .byte 00 sv_rs_entry .word 0000 sv_rs_ent_xb  read_req .equ 00 write_req .equ 01 repeat_req .equ 09 sdt .equ 0EED9 sdt_adrl .equ sdt+1+19+19 sdt_adrh .equ sdt_adrl+19 sdt_bnk .equ sdt_adrh+19   ; ****** data areas ******* ;command key for module .word start-1 .word end-start .ascii "Remote3 " ;module name  ; ****** equates *******  patch_area .equ 19A0 req_code .equ 18C0 sdt_adrh,x 0 0.if debug 0sta db_02 0stx db_03 0.endc 0 0 0lda sdt_bnk,x 0sta sv_co_ent_xb 0lda breg 0sta sdt_bnk,x get_rs_info ;for now we won't trap rs device calls 0ldx rs_dnum 0lda sdt_adrl,x 0sta sv_rs_entry 0 0lda sdt_adrh,x 0sta sv_rs_entry+1 0 0lda sdt_bnk,x 0sta sv_rs_ent_xb  0plp 0rts  0dbstr "wrap_init" 0 wrap_init moveb sv_co_ent_xb,co_what+1 0moveb sv_rs_ent_xb,rs_what+1 0 0clc 0lda  1 2 DATA ENTRY 3 4 EQUATE MAIN EQUATES <<а&<<·<·O^F¬<¬stat 02 is set newline 0.word set_nl_list  set_nl_list .byte 80 0.byte 0d   end .end 0.word rs_name op_refnum .byte 00 0.word 0000 ;ignored 0.byte 00 ;ignored  close_parms .byte 01 cl_refnum .byte 00 0 set_nl_parms .byte 03 set_nl_dnum .byte 00 0.byte 02 ;ose_rs232 .byte 00 0.byte 0cc 0.word close_parms 0rts  set_newline ;d_control #2 for rs232 0moveb rs_dnum,set_nl_dnum 0.byte 00 0.byte 083 0.word set_nl_parms 0rts  open_parms .byte 04 --------------------------------- 0dbstr "do_read" 0 do_read jsr do_rs_actual 0rts my_rs_handler rts 0 0dbstr "open/close rs232" open_rs232 .byte 00 0.byte 0c8 0.word open_parms 0moveb op_refnum,cl_refnum 0rts  cl #read_req 0bne $090 0jmp do_read $090 jsr do_co_actual 0rts ;------------------------------------------------------------ 0dbstr "do_write" do_write 0jsr do_rs_actual 0rts 0 ;-------------------------0cmp #repeat_req 0bne $010 0lda last_req 0sta req_code 0 $010 sta last_req 0cmp #write_req 0bne $020 0jmp do_write 0 $020 cmp a #00 0sta breg 0rts ;----------------------------------------------------------------  dbstr "my_co_handler"  my_co_handler / 0lda hook_flag 0beq $090 0 $005 lda req_code _actual"  do_rs_actual ldx #10 $01 lda x_rs_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts  x_rs_actual rs_what lda #00 0sta breg rs_here jsr rs_here rs_whatx ld01 0jsr patch_area 0rts 0  x_co_actual co_what lda #00 0sta breg co_here jsr co_here co_whatx lda #00 0sta breg 0rts ;locate at non-switched area (1990) then jsr to it for rs actual ; 0dbstr "do_rs0sta co_whatx+1 0sta rs_whatx+1 0rts 0 ;locate at non-switched area (1990) then jsr to it for co actual ; 0dbstr "do_co_actual" 0  do_co_actual ldx #10 $01 lda x_co_actual,x 0sta patch_area,x 0dex 0bpl $ sv_co_entry 0adc #01 0sta co_here+1 0lda sv_co_entry+1 0adc #00 0sta co_here+2 0 0 0clc 0lda sv_rs_entry 0adc #01 0sta rs_here+1 0lda sv_rs_entry+1 0adc #00 0sta rs_here+2 0 0lda breg Ѓ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘andler in this code ; ; my_cons_handler will check for read or write (and manage repeat) ; if its a read then do a read of .rs232 instead ; if its a write then do a write of .rs232 instead ; ;---------------------------------------------------mp turn_on  $010 jmp turn_off  ;------------------------------------------------------------- ; do_init ::: ; ; find the .console and .rs232 handlers in sdt plug them into our code ; then change the .console handler to point into my_cons_hrs_dnum .byte 00 last_req .byte 00  ;****** entry ******** ( (dbstr "entry" (  entry (lda init_flag (bmi $005 (jsr do_init $005 jsr query_on_off (and #5f (cmp #"Y" (bne $010 (j .byte 08 0.ascii ".CONSOLE "  p_co_name .word co_name ;in the dcb   rs_name .byte 07 0.ascii ".RS232X " p_rs_name .word rs_name ;in the dcb co_dnum .byte 00 .byte 00  p_my_co_handler .word my_co_handler-1 p_my_rs_handler .word my_rs_handler-1   init_flag .byte 00 ;00=no init yet, 80=init done  hook_flag .byte 00 ;00=no hookup, 80=hookup   co_name sv_ereg .byte 00 on_off_msg .ascii "REMO> Do you wish to turn Remote/// ON (Y/N) ?" 0.byte 0ff p_onoff_msg .word on_off_msg  sv_co_entry .word 0000 sv_co_ent_xb .byte 00 sv_rs_entry .word 0000 sv_rs_ent_xb  read_req .equ 00 write_req .equ 01 repeat_req .equ 09 sdt .equ 0EED9 sdt_adrl .equ sdt+1+19+19 sdt_adrh .equ sdt_adrl+19 sdt_bnk .equ sdt_adrh+19   ; ****** data areas ******* ;command key for module .word start-1 .word end-start .ascii "Remote3 " ;module name  ; ****** equates *******  patch_area .equ 19A0 req_code .equ 18C0 --------------------------------------------------- debug .equ 80 0 0.nolist (.include zpcommon (.include pkymacs (.include callmacs 0.list 0.nopatchlist 0.nomacrolist ( start jmp entry .ascii "R" SOLE ; ; 1.03 added code to un-write-protect top mem at init ; 1.02 added set newline for rs232 on open and debug stuff ; 1.01 added open/close of .RS232 to turn on/off ; disable ints for setup ;-------------- .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : REMOTE/// Cmd Key: GR ; ; Date : 12/03/86 Version : 1.03 Name Code : REMO ; ; Description : Hooks .RS232 to .CON----------- 0dbstr "do init"  do_init 0moveb ereg,sv_ereg 0and #0f7 ;unwrite protect top 0sta ereg 0 0jsr get_dnums 0jsr get_sdt_stuff 0jsr wrap_init 0lda #080 0sta init_flag 0 0moveb sv_ereg,ereg 0rts  query_on_off 0CALL m_msg0,p_onoff_msg 0CALL m_get_char 0rts  turn_on jsr open_rs232 0jsr set_newline 0lda #080 0sta hook_flag 0rts turn_off lda #000 --------------------------------- 0dbstr "do_read" 0 do_read jsr do_rs_actual 0rts my_rs_handler rts 0 0dbstr "open/close rs232" open_rs232 .byte 00 0.byte 0c8 0.word open_parms 0moveb op_refnum,cl_refnum 0rts  cl #read_req 0bne $090 0jmp do_read $090 jsr do_co_actual 0rts ;------------------------------------------------------------ 0dbstr "do_write" do_write 0jsr do_rs_actual 0rts 0 ;-------------------------0cmp #repeat_req 0bne $010 0lda last_req 0sta req_code 0 $010 sta last_req 0cmp #write_req 0bne $020 0jmp do_write 0 $020 cmp a #00 0sta breg 0rts ;----------------------------------------------------------------  dbstr "my_co_handler"  my_co_handler / 0lda hook_flag 0beq $090 0 $005 lda req_code _actual"  do_rs_actual ldx #10 $01 lda x_rs_actual,x 0sta patch_area,x 0dex 0bpl $01 0jsr patch_area 0rts  x_rs_actual rs_what lda #00 0sta breg rs_here jsr rs_here rs_whatx ld01 0jsr patch_area 0rts 0  x_co_actual co_what lda #00 0sta breg co_here jsr co_here co_whatx lda #00 0sta breg 0rts ;locate at non-switched area (1990) then jsr to it for rs actual ; 0dbstr "do_rs0sta co_whatx+1 0sta rs_whatx+1 0rts 0 ;locate at non-switched area (1990) then jsr to it for co actual ; 0dbstr "do_co_actual" 0  do_co_actual ldx #10 $01 lda x_co_actual,x 0sta patch_area,x 0dex 0bpl $ sv_co_entry 0adc #01 0sta co_here+1 0lda sv_co_entry+1 0adc #00 0sta co_here+2 0 0 0clc 0lda sv_rs_entry 0adc #01 0sta rs_here+1 0lda sv_rs_entry+1 0adc #00 0sta rs_here+2 0 0lda breg sta sv_rs_entry 0 0lda sdt_adrh,x 0sta sv_rs_entry+1 0 0lda sdt_bnk,x 0sta sv_rs_ent_xb  0plp 0rts  0dbstr "wrap_init" 0 wrap_init moveb sv_co_ent_xb,co_what+1 0moveb sv_rs_ent_xb,rs_what+1 0 0clc 0lda sdt_adrh,x 0 0.if debug 0sta db_02 0stx db_03 0.endc 0 0 0lda sdt_bnk,x 0sta sv_co_ent_xb 0lda breg 0sta sdt_bnk,x get_rs_info ;for now we won't trap rs device calls 0ldx rs_dnum 0lda sdt_adrl,x 00.endc 0ldx co_dnum 0lda sdt_adrl,x 0sta sv_co_entry 0lda p_my_co_handler 0sta sdt_adrl,x 0 0.if debug 0sta db_00 0stx db_01 0.endc 0 0lda sdt_adrh,x 0sta sv_co_entry+1 0lda p_my_co_handler+1 0staf" 0 0.if debug in_flag .byte 00 db_00 .byte 00 db_01 .byte 00 db_02 .byte 00 db_03 .byte 00 0.endc 0 get_sdt_stuff 0php 0sei get_set_co_info 0.if debug 0moveb #0da,in_flag s .byte 02  gdnum_name .word 0000 dnum .byte 00  get_dnum brk 0.byte 084 0.word gdnum_parms 0bne err 0rts   err rts ;get dnum ERROR   0dbstr "get_sdt_stuf0sta hook_flag 0jsr close_rs232 0rts 0  0dbstr "get_dnums" get_dnums 0movew p_co_name,gdnum_name 0jsr get_dnum 0moveb dnum,co_dnum 0 0movew p_rs_name,gdnum_name 0jsr get_dnum 0moveb dnum,rs_dnum 0rts   gdnum_parmose_rs232 .byte 00 0.byte 0cc 0.word close_parms 0rts  set_newline ;d_control #2 for rs232 0moveb rs_dnum,set_nl_dnum 0.byte 00 0.byte 083 0.word set_nl_parms 0rts  open_parms .byte 04 0.word rs_name op_refnum .byte 00 0.word 0000 ;ignored 0.byte 00 ;ignored  close_parms .byte 01 cl_refnum .byte 00 0 set_nl_parms .byte 03 set_nl_dnum .byte 00 0.byte 02 ;pi_mybuff .word mybuff-2000 eof_error .equ 04C echo_list .byte 00 p_echo_list .word echo_list  echo_off lda #000 0beq echo_x echo_on lda #0c0 echo_x sta echo_list 0CALL m_cons_0.byte 0ff p_gname_msg .word gname_msg  refnum .byte 00 line_number .byte 00 eighty .word 0050 act_read .byte 00  my_buff .block 50,20 .byte 0ff  p_mybuff .word mybuff entry .ascii "V" ;command key for module .word start-1 .word end-start .ascii "FileScan" ;module name gname_msg .ascii "SCAN> Enter name of file to scan : " utility, ascii-text only ; ; ; 2.01 added logic to handle last line <80 bytes correctly ; ;----------------------------------------------------------------- (.include zpcommon (.include pkymacs (.include callmacs start jmp .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : FileScan Cmd Key: (V)iew file ; ; Date : 09/11/86 Version : 2.01 Name Code : SCAN ; ; Description : More type ’”•–—™љ›њ1 2 ъ ъ O^F¬©¬stat 02 is set newline 0.word set_nl_list  set_nl_list .byte 80 0.byte 0d   end .end cntl,#0b,p_echo_list 0rts  entry (lda #15 (jsr put_char (lda #0f (jsr put_char ;enable scroll ( (CALL m_msg0,p_gname_msg (CALL m_get_fname (CALL m_sos_open (bne file_error (moveb p1,refnum  jsr set_newline (jsr echo_off ( (lda #1c ;clear home (jsr put_char ( $005 moveb #22.,line_number $010 CALL m_sos_read,refnum,eighty,pi_mybuff  bne file_error (moveb p1,act_read ќџ ЎўЈ¤Ґ¦§1 2 ъ ъ O^F¬©¬$010 inx 0cpx #050 0bne $005 0rts  $020 inx 0lda #0ff 0sta my_buff,x rts 0     end .end buff,x ;2.01  $002  ldx #00 $005 lda my_buff,x 0cmp #0d 0beq $020 0and #7f 0sta my_buff,x 0 0cmp #20 0bcs $010 0lda #"." 0sta my_buff,x  num .byte 00 0.byte 080 0.byte 00d  set_ascii lda act_read ;2.01 0cmp eighty ;2.01 0beq $002 0 0tax ;2.01 0lda #0d ;2.01 0sta myar 0jmp done get_char CALL m_get_char 0rts  put_char CALL m_put_char 0rts  set_newline ( moveb refnum,nl_refnum ( brk 0.byte 0C9 ( .word nl_plist ( rts nl_plist .byte 03 nl_ref(jsr put_char ;disable scroll (lda #07 (jsr put_char (lda #1c (jsr put_char (rts (  file_error cmp #eof_error 0beq $080 0CALL m_file_error 0jmp done 0 $080 jsr get_ch ;2.01 (jsr set_ascii (CALL m_msg,p_mybuff  (dec line_number (bne $010 ( (jsr get_char (cmp #1b (bne $005 done CALL m_sos_close,refnum (jsr echo_on (lda #15 .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : FileScan Cmd Key: (V)iew file ; ; Date : 09/11/86 Version : 2.01 Name Code : SCAN ; ; Description : More type $010 inx 0cpx #050 0bne $005 0rts  $020 inx 0lda #0ff 0sta my_buff,x rts 0     end .end buff,x ;2.01  $002  ldx #00 $005 lda my_buff,x 0cmp #0d 0beq $020 0and #7f 0sta my_buff,x 0 0cmp #20 0bcs $010 0lda #"." 0sta my_buff,x  num .byte 00 0.byte 080 0.byte 00d  set_ascii lda act_read ;2.01 0cmp eighty ;2.01 0beq $002 0 0tax ;2.01 0lda #0d ;2.01 0sta myar 0jmp done get_char CALL m_get_char 0rts  put_char CALL m_put_char 0rts  set_newline ( moveb refnum,nl_refnum ( brk 0.byte 0C9 ( .word nl_plist ( rts nl_plist .byte 03 nl_ref(jsr put_char ;disable scroll (lda #07 (jsr put_char (lda #1c (jsr put_char (rts (  file_error cmp #eof_error 0beq $080 0CALL m_file_error 0jmp done 0 $080 jsr get_ch ;2.01 (jsr set_ascii (CALL m_msg,p_mybuff  (dec line_number (bne $010 ( (jsr get_char (cmp #1b (bne $005 done CALL m_sos_close,refnum (jsr echo_on (lda #15 jsr set_newline (jsr echo_off ( (lda #1c ;clear home (jsr put_char ( $005 moveb #22.,line_number $010 CALL m_sos_read,refnum,eighty,pi_mybuff  bne file_error (moveb p1,act_read cntl,#0b,p_echo_list 0rts  entry (lda #15 (jsr put_char (lda #0f (jsr put_char ;enable scroll ( (CALL m_msg0,p_gname_msg (CALL m_get_fname (CALL m_sos_open (bne file_error (moveb p1,refnum  pi_mybuff .word mybuff-2000 eof_error .equ 04C echo_list .byte 00 p_echo_list .word echo_list  echo_off lda #000 0beq echo_x echo_on lda #0c0 echo_x sta echo_list 0CALL m_cons_0.byte 0ff p_gname_msg .word gname_msg  refnum .byte 00 line_number .byte 00 eighty .word 0050 act_read .byte 00  my_buff .block 50,20 .byte 0ff  p_mybuff .word mybuff entry .ascii "V" ;command key for module .word start-1 .word end-start .ascii "FileScan" ;module name gname_msg .ascii "SCAN> Enter name of file to scan : " utility, ascii-text only ; ; ; 2.01 added logic to handle last line <80 bytes correctly ; ;----------------------------------------------------------------- (.include zpcommon (.include pkymacs (.include callmacs start jmp O^F¬H¬­Ї°±O^У¬Ц¬ .word end-start .ascii "________" ;module name entry  end .end ------------------------------------------------- (.include zpcommon (.include pkymacs (.include callmacs start jmp entry .ascii "_" ;command key for module .word start-1 .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : ________ Cmd Key: ________ ; ; Date : Version : Name Code : ; ; Description : ; ;----------------ЁЄ«¬ test .equ 0   p_msg1 .WORD msg1 msg_q_lf .ascii "TYPE> Add LineFeeds (Y/N) ?" 0.byte 0ff p_msg_q_lf .word msg_q_lf msg2 $.ascii "TYPE> Enter Lines to be sent to Printer. Press Q to quit" $.byte 0d (.ascii "vvvvvvvvv+vvvvvvvvv+vvv ;module name   refnum .BYTE 000 adj_line_ptr .word 0000 line_len .word 0000 add_lf_if_ff .byte 00  line_count .byte 00   msg1 .ascii "TYPE> Enter PRINTER Device Name : " (.BYTE 0ff .include zpcommon (.include pkymacs (.include callmacs start jmp entry .ascii "W" ;command key for module .word start-1 .word end-start .ascii "TypeRite" oard output to printer ; ; 2.03 changed exit from to Q ; 2.02 removed refs to show/echo cntl chars... lets just show em ; 2.01 add toggle/queries for add_lf and allow_cntl ; ;----------------------------------------------------------------- ( .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : TypeRite Cmd Key: type(W)riter ; ; Date : 09/12/86 Version : 2.03 Name Code : TYPE ; ; Description : pipe keybІґµ¶·ё№є»ј1 2 Њ#O^F¬Й¬vvvvvv+vvvvvvvvv+" (.ascii "vvvvvvvvv+vvvvvvvvv+vvvvvvvvv+vvvvvvvvv" (.byte 0d (.BYTE 0ff p_msg2 .WORD msg2 entry (; enable scroll (; get device name to send codes to (; show main prompt (; get lines and print'em until done (;wrap up ( (jsr get_dname (jsr q_lf jsr enable_scroll (jsr main_prompt ( (moveb #00,line_count ( (jsr do_lines (jsr wrap_up (rts q_lf CALL m_msg0,p_msg_q_lf (jsr get_char (ldx #00 (cmp #"Y" (bne $090ЅїАБВГДЕЖЗ1 2 Њ#O^F¬Й¬end (.end scroll_off (lda #15 (jsr put_char ;disable scroll (lda #07 (jsr put_char (rts put_1 CALL m_put1,refnum (rts (  put_char (CALL m_put_char (rts get_char (CALL m_get_char (and #05f (rts   main_prompt (CALL m_msg0,p_msg2 (rts wrap_up  jsr scroll_off (CALL m_sos_close,refnum (rts ( enable_scroll (lda #15 (jsr put_char (lda #0f (jsr put_char ;enable scroll (rts  ldx #00 $020 stx line_count ( (bit add_lf_if_ff (bpl $010 (lda #0a (jsr put_1 (jmp $010 $090 rts set_linelen (dec p1 (bne $010 (dec p2  $010 ldy #00 (lda @p1,y (sta line_len (rts  p #"Q" (beq $090 ( $012 CALL m_sos_write,refnum,line_len,adj_line_ptr (bne file_error ( (lda #0d (jsr put_char ;cr to console ( (ldx line_count (inx (cpx #12 (bne $020 (jsr main_prompt ((CALL m_file_error (pla (pla (rts   do_lines $010 CALL m_get_line (movew p1,adj_line_ptr jsr set_linelen (cmp #02 ;check for exit condition (bne $012 ( (CALL m_get_lchar (and #05f (cm (dex $090 stx add_lf_if_ff  rts   get_dname (CALL m_msg0,p_msg1 ;write "enter device name" msg (CALL m_dflt_device (CALL m_sos_open (bne file_error (moveb p1,refnum (rts  file_error .proc pkymod,0 ;----------------------------------------------------------------- ; ; Module Name : TypeRite Cmd Key: type(W)riter ; ; Date : 09/12/86 Version : 2.03 Name Code : TYPE ; ; Description : pipe keybend (.end scroll_off (lda #15 (jsr put_char ;disable scroll (lda #07 (jsr put_char (rts put_1 CALL m_put1,refnum (rts (  put_char (CALL m_put_char (rts get_char (CALL m_get_char (and #05f (rts   main_prompt (CALL m_msg0,p_msg2 (rts wrap_up  jsr scroll_off (CALL m_sos_close,refnum (rts ( enable_scroll (lda #15 (jsr put_char (lda #0f (jsr put_char ;enable scroll (rts  ldx #00 $020 stx line_count ( (bit add_lf_if_ff (bpl $010 (lda #0a (jsr put_1 (jmp $010 $090 rts set_linelen (dec p1 (bne $010 (dec p2  $010 ldy #00 (lda @p1,y (sta line_len (rts  p #"Q" (beq $090 ( $012 CALL m_sos_write,refnum,line_len,adj_line_ptr (bne file_error ( (lda #0d (jsr put_char ;cr to console ( (ldx line_count (inx (cpx #12 (bne $020 (jsr main_prompt ((CALL m_file_error (pla (pla (rts   do_lines $010 CALL m_get_line (movew p1,adj_line_ptr jsr set_linelen (cmp #02 ;check for exit condition (bne $012 ( (CALL m_get_lchar (and #05f (cm (dex $090 stx add_lf_if_ff  rts   get_dname (CALL m_msg0,p_msg1 ;write "enter device name" msg (CALL m_dflt_device (CALL m_sos_open (bne file_error (moveb p1,refnum (rts  file_error jsr get_dname (jsr q_lf jsr enable_scroll (jsr main_prompt ( (moveb #00,line_count ( (jsr do_lines (jsr wrap_up (rts q_lf CALL m_msg0,p_msg_q_lf (jsr get_char (ldx #00 (cmp #"Y" (bne $090vvvvvv+vvvvvvvvv+" (.ascii "vvvvvvvvv+vvvvvvvvv+vvvvvvvvv+vvvvvvvvv" (.byte 0d (.BYTE 0ff p_msg2 .WORD msg2 entry (; enable scroll (; get device name to send codes to (; show main prompt (; get lines and print'em until done (;wrap up ( (p_msg1 .WORD msg1 msg_q_lf .ascii "TYPE> Add LineFeeds (Y/N) ?" 0.byte 0ff p_msg_q_lf .word msg_q_lf msg2 $.ascii "TYPE> Enter Lines to be sent to Printer. Press Q to quit" $.byte 0d (.ascii "vvvvvvvvv+vvvvvvvvv+vvv ;module name   refnum .BYTE 000 adj_line_ptr .word 0000 line_len .word 0000 add_lf_if_ff .byte 00  line_count .byte 00   msg1 .ascii "TYPE> Enter PRINTER Device Name : " (.BYTE 0ff .include zpcommon (.include pkymacs (.include callmacs start jmp entry .ascii "W" ;command key for module .word start-1 .word end-start .ascii "TypeRite" oard output to printer ; ; 2.03 changed exit from to Q ; 2.02 removed refs to show/echo cntl chars... lets just show em ; 2.01 add toggle/queries for add_lf and allow_cntl ; ;----------------------------------------------------------------- (O^R¬Г¬;n_xcons_5 .equ 0f ; ; sos functions ; ;n_sos_create .equ 10 ;n_sos_open .equ 11 ;n_sos_read .equ 12 ;n_sos_write .equ 13 ;n_sos_destroy .equ 14 ;n_sos_close .equ 15 ;n_sos_newline .equ 16 ;n_xsos_1 .equ 06 ;n_get1 .equ 07 ;n_get_char .equ 08 ;n_put1 .equ 09 ;n_put_char .equ 0a ;n_xcons_1 .equ 0b ;n_xcons_2 .equ 0c ;n_xcons_3 .equ 0d ;n_xcons_4 .equ 0e buff ptr here (e.g. keymaps) ; ; ;call numbers next ; ; console functions ; ;n_cons_stat .equ 01 ;n_cons_cntl .equ 02 ;n_restore_scr .equ 03 ;n_getline .equ 04 ;n_dflt_line .equ 05 ;n_get_lchar a .equ 0f2 ;zp_on_flags .equ 0f4 ;zp_on_1_flag .equ 0f6 ;zp_key_123_data .equ 0f8 ;zp_spec_ch .equ 0fa ;zp_tbl_offset .equ 0fc ;cons_rw_buff .equ 0fe cons reads & writes store their ; ;ZP_CONS_COMMON .EQU 0E0 pointer to console/pky common area ;zp_p_dcb .equ 0E2 pointer to console DCB ; ;cmd_mode_flag .equ 000 offset into common blk of flag ; ;zp_cons_beginz .equ 0f0 ;zp_key_dat .equ 0Ce ;p12 .equ 0Cf ; ; ;hold_option .equ 0D1 ;hold_power_key .equ 0D2 ;hold_num_key_at .equ 0D3 ;hold_at_curs .equ 0D4 ;hold_cr_char .equ 0D5 ;pky_rw_buff .equ 0D6 ; ; 0C5 ;p3 .equ 0C6 ;p4 .equ 0C7 ;p5 .equ 0C8 ;p6 .equ 0C9 ;p7 .equ 0Ca ;p8 .equ 0Cb ;p9 .equ 0Cc ;p10 .equ 0Cd ;p11 .equ 0C1 address of handler ;call_number .equ 0C3 number of call ;call_return .equ 0C3 ;p0 .equ 0C3 ; ;call_parms .equ 0C4 0C4-0CF, max 12 bytes parms ;p1 .equ 0C4 ;p2 .equ;*************************************** ;zp C0-CF is CALL macro stuff ;zp D0-DF is COMMON STUFF in PKY bank ;zp E0-FF is CONSOLE STUFF in console bank ;******************************************* ; ;call_handler .equ 0C0 jmp byte ;call_addr ИКЛМНОПР .equ 17 ; ; file functions ; ;n_get_fname .equ 18 ;n_bin_load .equ 19 ;n_bin_save .equ 1a ;n_file_error .equ 1b ;n_build_pname .equ 1c ;n_copy_pname .equ 1d ;n_dflt_device .equ 1e ;n_xfile_4 .equ 1f ; ; misc functions ; ;n_msg0 .equ 20 ;n_msg .equ 21 ;n_cntl8 .equ 22 ;n_get_atcurs .equ 23 ;n_get_numeric .equ 24 ;n_xmisc_2 .equ 25 ;n_xmisc_3 .equ 26 ;n_xmisc_4 .equ ;cons reads & writes store their H;buff ptr here (e.g. keymaps) fset into common blk of flag zp_cons_beginz .equ 0f0 zp_key_data .equ 0f2 zp_on_flags .equ 0f4 zp_on_1_flag .equ 0f6 zp_key_123_data .equ 0f8 zp_spec_ch .equ 0fa zp_tbl_offset .equ 0fc cons_rw_buff .equ 0fe ZP_CONS_COMMON .EQU 0E0 ;pointer to console/pky common area zp_p_dcb .equ 0E2 ;pointer to console DCB  o_dcb_prefix .equ 010 ;offset to prefix info in dcb cmd_mode_flag .equ 000 ;ofCe p12 .equ 0Cf hold_option .equ 0D1 hold_power_key .equ 0D2 hold_num_key_at .equ 0D3 hold_at_curs .equ 0D4 hold_cr_char .equ 0D5 pky_rw_buff .equ 0D6 5 p3 .equ 0C6 p4 .equ 0C7 p5 .equ 0C8 p6 .equ 0C9 p7 .equ 0Ca p8 .equ 0Cb p9 .equ 0Cc p10 .equ 0Cd p11 .equ 0.equ 0C1 ;address of handler call_number .equ 0C3 ;number of call call_return .equ 0C3 p0 .equ 0C3 call_parms .equ 0C4 ;0C4-0CF, max 12 bytes parms p1 .equ 0C4 p2 .equ 0C;*************************************** ;zp C0-CF is CALL macro stuff ;zp D0-DF is COMMON STUFF in PKY bank ;zp E0-FF is CONSOLE STUFF in console bank ;******************************************* call_handler .equ 0C0 ;jmp byte call_addr СУФХЦЧO^R¬C¬27 ; оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо