Disassembly:Democart 2
From veswiki
This is a disassembly of the Channel F Democart 2. Original code is copyright © 1977 Fairchild Semiconductor.
; ----------------------------------------------------------------------------- ; Annotated and formatted Democart 2 disassembly. ; ----------------------------------------------------------------------------- processor f8 org $0800 reset equ $0000 delay equ $008F clrscrn equ $00D0 pushk equ $0107 popk equ $011E drawchar equ $0679 drawchar_entry equ $067C b_drawchar_bmp_entry equ $068A b_score_left equ $02AC b_score_right equ $02B5 cartridge_start: .byte $55, $2B ; ----------------------------------------------------------------------------- ; Main Democart 2 script. Shows multiple demo screens, uses BIOS text and ; graphics routines, then returns to BIOS reset. ; ----------------------------------------------------------------------------- cartridge_entry: lisu 3 ; 0802 63 lisl 7 ; 0803 6F lis 1 ; 0804 71 lr S,A ; 0805 5C - store A in selected scratchpad register pi $0135 ; 0806 28 01 35 dci L0BC6 ; 0809 2A 0B C6 - load DC with data/code pointer pi draw_stream ; 080C 28 0B A3 lisu 3 ; 080F 63 lisl 7 ; 0810 6F lis 3 ; 0811 73 lr S,A ; 0812 5C - store A in selected scratchpad register pi $0135 ; 0813 28 01 35 dci L0BCF ; 0816 2A 0B CF - load DC with data/code pointer pi draw_stream ; 0819 28 0B A3 lis 6 ; 081C 76 lr 3,A ; 081D 53 pi clear_screen_o37_0 ; 081E 28 0F EA li $26 ; 0821 20 26 lr 1,A ; 0823 51 li $14 ; 0824 20 14 lr 2,A ; 0826 52 li $28 ; 0827 20 28 lr 3,A ; 0829 53 pi draw_entity_wrapper ; 082A 28 0B 76 li $26 ; 082D 20 26 lr 1,A ; 082F 51 li $21 ; 0830 20 21 lr 2,A ; 0832 52 li $28 ; 0833 20 28 lr 3,A ; 0835 53 pi draw_entity_wrapper ; 0836 28 0B 76 li $33 ; 0839 20 33 lr 1,A ; 083B 51 pi draw_three_markers ; 083C 28 0B 7D li $41 ; 083F 20 41 lr 1,A ; 0841 51 pi draw_three_markers ; 0842 28 0B 7D dci L0BD8 ; 0845 2A 0B D8 - load DC with data/code pointer pi draw_stream ; 0848 28 0B A3 clr ; 084B 70 lr 3,A ; 084C 53 pi clear_screen_o37_1 ; 084D 28 0F ED li $14 ; 0850 20 14 lr 1,A ; 0852 51 lis 6 ; 0853 76 lr 2,A ; 0854 52 pi $020E ; 0855 28 02 0E li $14 ; 0858 20 14 lr 1,A ; 085A 51 li $2E ; 085B 20 2E lr 2,A ; 085D 52 pi $020E ; 085E 28 02 0E li $12 ; 0861 20 12 lr 1,A ; 0863 51 lr 2,A ; 0864 52 li $58 ; 0865 20 58 lr 0,A ; 0867 50 pi drawchar ; 0868 28 06 79 - BIOS draw character routine dci L0BE6 ; 086B 2A 0B E6 - load DC with data/code pointer pi draw_stream ; 086E 28 0B A3 lis 6 ; 0871 76 lr 3,A ; 0872 53 pi clear_screen_o37_0 ; 0873 28 0F EA lis 6 ; 0876 76 lr $A,A ; 0877 5A dci L0C98 ; 0878 2A 0C 98 - load DC with data/code pointer li $20 ; 087B 20 20 lr 1,A ; 087D 51 lr 2,A ; 087E 52 L087F: li $80 ; 087F 20 80 lr 0,A ; 0881 50 pi b_drawchar_bmp_wrapper ; 0882 28 0F CD lis 2 ; 0885 72 as 1 ; 0886 C1 lr 1,A ; 0887 51 ds $A ; 0888 3A bnz L087F ; 0889 94 F5 pi short_delay ; 088B 28 0B 96 lis 6 ; 088E 76 lr 3,A ; 088F 53 pi clear_screen_o37_0 ; 0890 28 0F EA li $18 ; 0893 20 18 lr 2,A ; 0895 52 li $30 ; 0896 20 30 lr 1,A ; 0898 51 dci L0CC8 ; 0899 2A 0C C8 - load DC with data/code pointer li $80 ; 089C 20 80 lr 0,A ; 089E 50 pi b_drawchar_bmp_wrapper ; 089F 28 0F CD lis 2 ; 08A2 72 as 1 ; 08A3 C1 lr 1,A ; 08A4 51 li $80 ; 08A5 20 80 lr 0,A ; 08A7 50 dci L0CC8 ; 08A8 2A 0C C8 - load DC with data/code pointer pi b_drawchar_bmp_wrapper ; 08AB 28 0F CD li $30 ; 08AE 20 30 lr 1,A ; 08B0 51 li $20 ; 08B1 20 20 lr 2,A ; 08B3 52 li $80 ; 08B4 20 80 lr 0,A ; 08B6 50 dci L0CC8 ; 08B7 2A 0C C8 - load DC with data/code pointer pi b_drawchar_bmp_wrapper ; 08BA 28 0F CD lis 2 ; 08BD 72 as 1 ; 08BE C1 lr 1,A ; 08BF 51 li $80 ; 08C0 20 80 lr 0,A ; 08C2 50 dci L0CC8 ; 08C3 2A 0C C8 - load DC with data/code pointer pi b_drawchar_bmp_wrapper ; 08C6 28 0F CD dci L0CD0 ; 08C9 2A 0C D0 - load DC with data/code pointer pi draw_stream ; 08CC 28 0B A3 lis 6 ; 08CF 76 lr 3,A ; 08D0 53 pi clear_screen_o37_1 ; 08D1 28 0F ED li $13 ; 08D4 20 13 lr 1,A ; 08D6 51 lis 6 ; 08D7 76 lr 2,A ; 08D8 52 pi $020E ; 08D9 28 02 0E li $13 ; 08DC 20 13 lr 1,A ; 08DE 51 li $2F ; 08DF 20 2F lr 2,A ; 08E1 52 pi $020E ; 08E2 28 02 0E li $11 ; 08E5 20 11 lr 1,A ; 08E7 51 lis 9 ; 08E8 79 lr 2,A ; 08E9 52 li $24 ; 08EA 20 24 lr 3,A ; 08EC 53 pi bios_draw_a01fc_wrapper ; 08ED 28 0F C6 li $5A ; 08F0 20 5A lr 1,A ; 08F2 51 lis 9 ; 08F3 79 lr 2,A ; 08F4 52 li $24 ; 08F5 20 24 lr 3,A ; 08F7 53 pi bios_draw_a01fc_wrapper ; 08F8 28 0F C6 lis 9 ; 08FB 79 lr 4,A ; 08FC 54 dci L0C00 ; 08FD 2A 0C 00 - load DC with data/code pointer L0900: lm ; 0900 16 - load byte from DC and increment DC lr 1,A ; 0901 51 lm ; 0902 16 - load byte from DC and increment DC lr 2,A ; 0903 52 lm ; 0904 16 - load byte from DC and increment DC lr 0,A ; 0905 50 xdc ; 0906 2C - exchange DC and H pointers dci $0C1B ; 0907 2A 0C 1B - load DC with data/code pointer pi drawchar_entry ; 090A 28 06 7C xdc ; 090D 2C - exchange DC and H pointers ds 4 ; 090E 34 bnz L0900 ; 090F 94 F0 pi bios_score_prompt_wrapper ; 0911 28 0F D6 dci L0BF9 ; 0914 2A 0B F9 - load DC with data/code pointer pi draw_stream ; 0917 28 0B A3 lis 6 ; 091A 76 lr 3,A ; 091B 53 pi clear_screen_o37_0 ; 091C 28 0F EA clr ; 091F 70 lr 2,A ; 0920 52 lr 0,A ; 0921 50 lis $D ; 0922 7D lr $A,A ; 0923 5A L0924: li $7E ; 0924 20 7E lr 1,A ; 0926 51 pi drawchar ; 0927 28 06 79 - BIOS draw character routine lr A,2 ; 092A 42 inc ; 092B 1F lr 2,A ; 092C 52 ds $A ; 092D 3A bnz L0924 ; 092E 94 F5 L0930: lis 4 ; 0930 74 as 2 ; 0931 C2 lr 2,A ; 0932 52 lis 3 ; 0933 73 lr 1,A ; 0934 51 L0935: li $C0 ; 0935 20 C0 lr 0,A ; 0937 50 dci $4000 ; 0938 2A 40 00 - load DC with data/code pointer ; Points data counter to unused area. ; Hardware holds the proper value. pi drawchar_entry ; 093B 28 06 7C ds 1 ; 093E 31 lr A,1 ; 093F 41 ci $77 ; 0940 25 77 bc L0935 ; 0942 82 F2 lr A,2 ; 0944 42 ci $28 ; 0945 25 28 bc L0930 ; 0947 82 E8 lis 3 ; 0949 73 lr $A,A ; 094A 5A li $26 ; 094B 20 26 lr 2,A ; 094D 52 L094E: lis 8 ; 094E 78 lr 1,A ; 094F 51 clr ; 0950 70 lr 0,A ; 0951 50 L0952: pi drawchar ; 0952 28 06 79 - BIOS draw character routine lis 2 ; 0955 72 as 2 ; 0956 C2 lr 2,A ; 0957 52 ds 1 ; 0958 31 ds $A ; 0959 3A bnz L0952 ; 095A 94 F7 pi drawchar ; 095C 28 06 79 - BIOS draw character routine lr A,2 ; 095F 42 inc ; 0960 1F lr 2,A ; 0961 52 ds 1 ; 0962 31 pi drawchar ; 0963 28 06 79 - BIOS draw character routine lr A,2 ; 0966 42 ci $31 ; 0967 25 31 bnc L0973 ; 0969 92 09 li $2B ; 096B 20 2B lr 2,A ; 096D 52 lis 3 ; 096E 73 lr $A,A ; 096F 5A jmp L094E ; 0970 29 09 4E - unconditional jump L0973: nop ; 0973 2B clr ; 0974 70 lr 0,A ; 0975 50 li $2D ; 0976 20 2D lr 2,A ; 0978 52 L0979: li $53 ; 0979 20 53 lr 1,A ; 097B 51 pi drawchar ; 097C 28 06 79 - BIOS draw character routine ds 1 ; 097F 31 ds 2 ; 0980 32 pi drawchar ; 0981 28 06 79 - BIOS draw character routine lis 3 ; 0984 73 lr $A,A ; 0985 5A L0986: ds 2 ; 0986 32 ds 2 ; 0987 32 ds 1 ; 0988 31 pi drawchar ; 0989 28 06 79 - BIOS draw character routine ds $A ; 098C 3A bnz L0986 ; 098D 94 F8 lr A,2 ; 098F 42 ci $27 ; 0990 25 27 bnc L099A ; 0992 92 07 li $30 ; 0994 20 30 lr 2,A ; 0996 52 jmp L0979 ; 0997 29 09 79 - unconditional jump L099A: pi bios_score_prompt_wrapper ; 099A 28 0F D6 dci L0C76 ; 099D 2A 0C 76 - load DC with data/code pointer li $69 ; 09A0 20 69 lr $A,A ; 09A2 5A pi draw_stream ; 09A3 28 0B A3 pi draw_stream ; 09A6 28 0B A3 clr ; 09A9 70 lr $A,A ; 09AA 5A pi draw_stream ; 09AB 28 0B A3 lis 3 ; 09AE 73 lr 3,A ; 09AF 53 pi clear_screen_o37_0 ; 09B0 28 0F EA dci L0C34 ; 09B3 2A 0C 34 - load DC with data/code pointer xdc ; 09B6 2C - exchange DC and H pointers dci L0C67 ; 09B7 2A 0C 67 - load DC with data/code pointer lis 5 ; 09BA 75 lr $A,A ; 09BB 5A L09BC: lm ; 09BC 16 - load byte from DC and increment DC lr 1,A ; 09BD 51 lm ; 09BE 16 - load byte from DC and increment DC lr 2,A ; 09BF 52 lm ; 09C0 16 - load byte from DC and increment DC lr 0,A ; 09C1 50 xdc ; 09C2 2C - exchange DC and H pointers pi b_drawchar_bmp_wrapper ; 09C3 28 0F CD xdc ; 09C6 2C - exchange DC and H pointers ds $A ; 09C7 3A bnz L09BC ; 09C8 94 F3 dci L0C5C ; 09CA 2A 0C 5C - load DC with data/code pointer pi draw_stream ; 09CD 28 0B A3 lis 3 ; 09D0 73 lr 3,A ; 09D1 53 pi clear_screen_o37_1 ; 09D2 28 0F ED pi bios_score_prompt_wrapper ; 09D5 28 0F D6 lis 9 ; 09D8 79 lr $A,A ; 09D9 5A dci L0CDE ; 09DA 2A 0C DE - load DC with data/code pointer L09DD: lm ; 09DD 16 - load byte from DC and increment DC lr 1,A ; 09DE 51 lm ; 09DF 16 - load byte from DC and increment DC lr 2,A ; 09E0 52 lm ; 09E1 16 - load byte from DC and increment DC lr 0,A ; 09E2 50 xdc ; 09E3 2C - exchange DC and H pointers dci $0CF9 ; 09E4 2A 0C F9 - load DC with data/code pointer pi drawchar_entry ; 09E7 28 06 7C xdc ; 09EA 2C - exchange DC and H pointers ds $A ; 09EB 3A bnz L09DD ; 09EC 94 F0 dci $0D08 ; 09EE 2A 0D 08 - load DC with data/code pointer pi draw_stream ; 09F1 28 0B A3 lis 3 ; 09F4 73 lr 3,A ; 09F5 53 pi clear_screen_o37_1 ; 09F6 28 0F ED pi bios_score_prompt_wrapper ; 09F9 28 0F D6 li $10 ; 09FC 20 10 lr 1,A ; 09FE 51 li $1A ; 09FF 20 1A lr 2,A ; 0A01 52 li $10 ; 0A02 20 10 lr 3,A ; 0A04 53 pi draw_entity_wrapper ; 0A05 28 0B 76 lis 2 ; 0A08 72 lr $A,A ; 0A09 5A L0A0A: lis $F ; 0A0A 7F lr 3,A ; 0A0B 53 lis $F ; 0A0C 7F as 1 ; 0A0D C1 lr 1,A ; 0A0E 51 pi draw_entity_wrapper ; 0A0F 28 0B 76 ds $A ; 0A12 3A bnz L0A0A ; 0A13 94 F6 li $69 ; 0A15 20 69 lr $A,A ; 0A17 5A dci L0D14 ; 0A18 2A 0D 14 - load DC with data/code pointer pi draw_stream ; 0A1B 28 0B A3 pi draw_stream ; 0A1E 28 0B A3 pi draw_stream ; 0A21 28 0B A3 li $30 ; 0A24 20 30 lr 1,A ; 0A26 51 li $28 ; 0A27 20 28 lr 2,A ; 0A29 52 li $10 ; 0A2A 20 10 lr 3,A ; 0A2C 53 pi draw_entity_wrapper ; 0A2D 28 0B 76 lis 6 ; 0A30 76 lr $A,A ; 0A31 5A dci L0D44 ; 0A32 2A 0D 44 - load DC with data/code pointer L0A35: lm ; 0A35 16 - load byte from DC and increment DC lr 1,A ; 0A36 51 lm ; 0A37 16 - load byte from DC and increment DC lr 2,A ; 0A38 52 lm ; 0A39 16 - load byte from DC and increment DC lr 0,A ; 0A3A 50 xdc ; 0A3B 2C - exchange DC and H pointers pi drawchar ; 0A3C 28 06 79 - BIOS draw character routine xdc ; 0A3F 2C - exchange DC and H pointers ds $A ; 0A40 3A bnz L0A35 ; 0A41 94 F3 dci L0D56 ; 0A43 2A 0D 56 - load DC with data/code pointer clr ; 0A46 70 lr $A,A ; 0A47 5A pi draw_stream ; 0A48 28 0B A3 lis 6 ; 0A4B 76 lr 3,A ; 0A4C 53 pi clear_screen_o37_1 ; 0A4D 28 0F ED pi bios_score_prompt_wrapper ; 0A50 28 0F D6 dci L0D61 ; 0A53 2A 0D 61 - load DC with data/code pointer li $69 ; 0A56 20 69 lr $A,A ; 0A58 5A pi draw_stream ; 0A59 28 0B A3 pi draw_stream ; 0A5C 28 0B A3 pi draw_stream ; 0A5F 28 0B A3 clr ; 0A62 70 lr $A,A ; 0A63 5A pi draw_stream ; 0A64 28 0B A3 lis 6 ; 0A67 76 lr 3,A ; 0A68 53 pi clear_screen_o37_1 ; 0A69 28 0F ED pi bios_score_prompt_wrapper ; 0A6C 28 0F D6 dci L0D79 ; 0A6F 2A 0D 79 - load DC with data/code pointer lis 6 ; 0A72 76 lr $A,A ; 0A73 5A L0A74: lm ; 0A74 16 - load byte from DC and increment DC lr 1,A ; 0A75 51 lm ; 0A76 16 - load byte from DC and increment DC lr 2,A ; 0A77 52 lm ; 0A78 16 - load byte from DC and increment DC lr 0,A ; 0A79 50 xdc ; 0A7A 2C - exchange DC and H pointers dci L0D8B ; 0A7B 2A 0D 8B - load DC with data/code pointer pi b_drawchar_bmp_wrapper ; 0A7E 28 0F CD xdc ; 0A81 2C - exchange DC and H pointers ds $A ; 0A82 3A bnz L0A74 ; 0A83 94 F0 dci $0D99 ; 0A85 2A 0D 99 - load DC with data/code pointer xdc ; 0A88 2C - exchange DC and H pointers dci L0DA8 ; 0A89 2A 0D A8 - load DC with data/code pointer lis 3 ; 0A8C 73 lr $A,A ; 0A8D 5A L0A8E: lm ; 0A8E 16 - load byte from DC and increment DC lr 1,A ; 0A8F 51 lm ; 0A90 16 - load byte from DC and increment DC lr 2,A ; 0A91 52 lm ; 0A92 16 - load byte from DC and increment DC lr 0,A ; 0A93 50 xdc ; 0A94 2C - exchange DC and H pointers pi drawchar_entry ; 0A95 28 06 7C xdc ; 0A98 2C - exchange DC and H pointers ds $A ; 0A99 3A bnz L0A8E ; 0A9A 94 F3 dci L0D93 ; 0A9C 2A 0D 93 - load DC with data/code pointer pi draw_stream ; 0A9F 28 0B A3 lis 6 ; 0AA2 76 lr 3,A ; 0AA3 53 pi clear_screen_o37_0 ; 0AA4 28 0F EA dci L0DB1 ; 0AA7 2A 0D B1 - load DC with data/code pointer lis 2 ; 0AAA 72 lr $A,A ; 0AAB 5A L0AAC: lm ; 0AAC 16 - load byte from DC and increment DC lr 1,A ; 0AAD 51 lm ; 0AAE 16 - load byte from DC and increment DC lr 2,A ; 0AAF 52 lm ; 0AB0 16 - load byte from DC and increment DC lr 0,A ; 0AB1 50 xdc ; 0AB2 2C - exchange DC and H pointers dci $0F58 ; 0AB3 2A 0F 58 - load DC with data/code pointer pi drawchar_entry ; 0AB6 28 06 7C xdc ; 0AB9 2C - exchange DC and H pointers ds $A ; 0ABA 3A bnz L0AAC ; 0ABB 94 F0 lis 4 ; 0ABD 74 lr $A,A ; 0ABE 5A li $10 ; 0ABF 20 10 lr 2,A ; 0AC1 52 L0AC2: li $17 ; 0AC2 20 17 lr 1,A ; 0AC4 51 li $81 ; 0AC5 20 81 lr 0,A ; 0AC7 50 pi drawchar ; 0AC8 28 06 79 - BIOS draw character routine lis 5 ; 0ACB 75 as 2 ; 0ACC C2 lr 2,A ; 0ACD 52 ci $27 ; 0ACE 25 27 bc L0AC2 ; 0AD0 82 F1 li $1A ; 0AD2 20 1A lr 1,A ; 0AD4 51 li $1A ; 0AD5 20 1A lr 2,A ; 0AD7 52 dci L0DC3 ; 0AD8 2A 0D C3 - load DC with data/code pointer lis 6 ; 0ADB 76 lr $A,A ; 0ADC 5A L0ADD: lm ; 0ADD 16 - load byte from DC and increment DC lr 0,A ; 0ADE 50 xdc ; 0ADF 2C - exchange DC and H pointers dci L0DC9 ; 0AE0 2A 0D C9 - load DC with data/code pointer pi drawchar_entry ; 0AE3 28 06 7C ds 1 ; 0AE6 31 ds 1 ; 0AE7 31 xdc ; 0AE8 2C - exchange DC and H pointers ds $A ; 0AE9 3A bnz L0ADD ; 0AEA 94 F2 li $2C ; 0AEC 20 2C lr 2,A ; 0AEE 52 li $12 ; 0AEF 20 12 lr 1,A ; 0AF1 51 li $80 ; 0AF2 20 80 lr 0,A ; 0AF4 50 dci L0DCE ; 0AF5 2A 0D CE - load DC with data/code pointer pi b_drawchar_bmp_wrapper ; 0AF8 28 0F CD li $43 ; 0AFB 20 43 lr 1,A ; 0AFD 51 li $40 ; 0AFE 20 40 lr 0,A ; 0B00 50 dci L0DCE ; 0B01 2A 0D CE - load DC with data/code pointer pi b_drawchar_bmp_wrapper ; 0B04 28 0F CD pi bios_score_prompt_wrapper ; 0B07 28 0F D6 dci L0DB7 ; 0B0A 2A 0D B7 - load DC with data/code pointer pi draw_stream ; 0B0D 28 0B A3 lis 6 ; 0B10 76 lr 3,A ; 0B11 53 pi clear_screen_o37_0 ; 0B12 28 0F EA dci L0DD6 ; 0B15 2A 0D D6 - load DC with data/code pointer lis 8 ; 0B18 78 lr 2,A ; 0B19 52 L0B1A: lis $F ; 0B1A 7F L0B1B: lr 1,A ; 0B1B 51 li $C0 ; 0B1C 20 C0 lr 0,A ; 0B1E 50 lm ; 0B1F 16 - load byte from DC and increment DC xdc ; 0B20 2C - exchange DC and H pointers lr $A,A ; 0B21 5A sr 4 ; 0B22 14 sl 4 ; 0B23 15 sr 1 ; 0B24 12 lr $B,A ; 0B25 5B lr A,$A ; 0B26 4A sl 4 ; 0B27 15 sr 1 ; 0B28 12 lr $A,A ; 0B29 5A dci L0E26 ; 0B2A 2A 0E 26 - load DC with data/code pointer lr A,$B ; 0B2D 4B adc ; 0B2E 8E pi b_drawchar_bmp_wrapper ; 0B2F 28 0F CD ds 1 ; 0B32 31 dci L0E26 ; 0B33 2A 0E 26 - load DC with data/code pointer lr A,$A ; 0B36 4A adc ; 0B37 8E li $C0 ; 0B38 20 C0 lr 0,A ; 0B3A 50 pi b_drawchar_bmp_wrapper ; 0B3B 28 0F CD xdc ; 0B3E 2C - exchange DC and H pointers ds 1 ; 0B3F 31 lr A,1 ; 0B40 41 ci $5A ; 0B41 25 5A bc L0B1B ; 0B43 82 D7 lis 4 ; 0B45 74 as 2 ; 0B46 C2 lr 2,A ; 0B47 52 ci $2F ; 0B48 25 2F bc L0B1A ; 0B4A 82 CF dci L0E96 ; 0B4C 2A 0E 96 - load DC with data/code pointer pi draw_stream ; 0B4F 28 0B A3 lis 6 ; 0B52 76 lr 3,A ; 0B53 53 pi clear_screen_o37_0 ; 0B54 28 0F EA L0B57: dci L0E9D ; 0B57 2A 0E 9D - load DC with data/code pointer lis $C ; 0B5A 7C L0B5B: lr $A,A ; 0B5B 5A L0B5C: lm ; 0B5C 16 - load byte from DC and increment DC lr 1,A ; 0B5D 51 lm ; 0B5E 16 - load byte from DC and increment DC lr 2,A ; 0B5F 52 lm ; 0B60 16 - load byte from DC and increment DC lr 0,A ; 0B61 50 xdc ; 0B62 2C - exchange DC and H pointers dci L0EC1 ; 0B63 2A 0E C1 - load DC with data/code pointer pi drawchar_entry ; 0B66 28 06 7C xdc ; 0B69 2C - exchange DC and H pointers ds $A ; 0B6A 3A bnz L0B5C ; 0B6B 94 F0 dci L0EE4 ; 0B6D 2A 0E E4 - load DC with data/code pointer pi draw_stream ; 0B70 28 0B A3 jmp reset ; 0B73 29 00 00 - unconditional jump ; ----------------------------------------------------------------------------- ; Wrapper around BIOS draw routine at $0215. Saves K, then tail-jumps into BIOS ; code. ; ----------------------------------------------------------------------------- draw_entity_wrapper: lr K,P ; 0B76 08 pi pushk ; 0B77 28 01 07 - bios pushk - save return address on BIOS K-stack jmp $0215 ; 0B7A 29 02 15 - bios, calls draw char - unconditional jump ; ----------------------------------------------------------------------------- ; Draws three repeated BIOS objects at fixed Y positions $0A, $17 and $24 using ; BIOS routine $01F6. ; ----------------------------------------------------------------------------- draw_three_markers: lr K,P ; 0B7D 08 pi pushk ; 0B7E 28 01 07 - bios pushk - save return address on BIOS K-stack lis $A ; 0B81 7A lr 2,A ; 0B82 52 pi $01F6 ; 0B83 28 01 F6 li $17 ; 0B86 20 17 lr 2,A ; 0B88 52 pi $01F6 ; 0B89 28 01 F6 li $24 ; 0B8C 20 24 lr 2,A ; 0B8E 52 pi $01F6 ; 0B8F 28 01 F6 pi popk ; 0B92 28 01 1E - restore return address from BIOS K-stack pk ; 0B95 0C - return via K/P after BIOS K-stack restore ; ----------------------------------------------------------------------------- ; Short delay helper. Uses r0 as outer counter and r5 as BIOS delay parameter. ; ----------------------------------------------------------------------------- short_delay: lr K,P ; 0B96 08 lis 3 ; 0B97 73 lr 0,A ; 0B98 50 lis $F ; 0B99 7F lr 5,A ; 0B9A 55 short_delay_loop: pi delay ; 0B9B 28 00 8F ds 0 ; 0B9E 30 bnz short_delay_loop ; 0B9F 94 FB lr P,K ; 0BA1 09 pop ; 0BA2 1C - return from subroutine ; ----------------------------------------------------------------------------- ; Draws a compressed or data-driven text/object stream. DC points at stream ; header: count, Y, X, then character/object bytes. ; ----------------------------------------------------------------------------- draw_stream: lr K,P ; 0BA3 08 pi pushk ; 0BA4 28 01 07 - bios pushk - save return address on BIOS K-stack lm ; 0BA7 16 - load byte from DC and increment DC lr 3,A ; 0BA8 53 lm ; 0BA9 16 - load byte from DC and increment DC lr 2,A ; 0BAA 52 lm ; 0BAB 16 - load byte from DC and increment DC lr 1,A ; 0BAC 51 ; ----------------------------------------------------------------------------- ; Inner stream loop. Loads one stream item from DC and draws through BIOS ; drawchar entry with alternate glyph/data pointer. ; ----------------------------------------------------------------------------- draw_stream_next: lm ; 0BAD 16 - load byte from DC and increment DC lr 0,A ; 0BAE 50 xdc ; 0BAF 2C - exchange DC and H pointers dci L0EEF ; 0BB0 2A 0E EF - load DC with data/code pointer ; ----------------------------------------------------------------------------- ; Calls BIOS drawchar entry for one stream item, advances, and repeats until ; count expires. ; ----------------------------------------------------------------------------- draw_stream_call: pi drawchar_entry ; 0BB3 28 06 7C xdc ; 0BB6 2C - exchange DC and H pointers ds 3 ; 0BB7 33 bnz draw_stream_next ; 0BB8 94 F4 lr A,$A ; 0BBA 4A ci $69 ; 0BBB 25 69 bz draw_stream_done ; 0BBD 84 04 pi short_delay ; 0BBF 28 0B 96 ; ----------------------------------------------------------------------------- ; Restores return address from BIOS K-stack and returns from stream drawing ; routine. ; ----------------------------------------------------------------------------- draw_stream_done: pi popk ; 0BC2 28 01 1E - restore return address from BIOS K-stack pk ; 0BC5 0C - return via K/P after BIOS K-stack restore L0BC6: lr QU,A ; 0BC6 06 sl 1 ; 0BC7 13 out $91 ; 0BC8 27 91 bf 9,L0B57 ; 0BCA 99 8C bnz L0B5B ; 0BCC 94 8E db $A3 ; 0BCE A3 L0BCF: lr QU,A ; 0BCF 06 oi $26 ; 0BD0 22 26 lr D,A ; 0BD2 5E - store A and decrement ISAR lr A,D ; 0BD3 4E - read selected scratchpad register and decrement ISAR lr 8,A ; 0BD4 58 lr 8,A ; 0BD5 58 lr 2,A ; 0BD6 52 lr I,A ; 0BD7 5D - store A and increment ISAR L0BD8: lr IS,A ; 0BD8 0B ds 1 ; 0BD9 31 di ; 0BDA 1A bf $E, L0B6E ; 0BDB 9E 92 xm ; 0BDD 8C lr A,KU ; 0BDE 00 lr D,A ; 0BDF 5E - store A and decrement ISAR lr A,$A ; 0BE0 4A lr A,S ; 0BE1 4C - read selected scratchpad register lr A,KU ; 0BE2 00 asd D ; 0BE3 DE asd 9 ; 0BE4 D9 as D ; 0BE5 CE L0BE6: lr DC,H ; 0BE6 10 li $0A ; 0BE7 20 0A bf $D, L0B7B ; 0BE9 9D 91 bf 9, L0B85 ; 0BEB 99 99 bf $E, L0B80 ; 0BED 9E 92 bno L0B80 ; 0BEF 98 90 lr A,KU ; 0BF1 00 br draw_three_markers ; 0BF2 90 8A - unconditional jump ; ----------------------------------------------------------------------------- ; data_tables ; Smart disassembly marks $0BF4-$0FC5 as data. ; ----------------------------------------------------------------------------- L0BF4: .byte $96, $96, $8E, $9C, $A3 ; 0BF4 L0BF9: .byte $04, $2B, $2D, $5E, $4A, $58, $54 ; 0BF9 L0C00: .byte $2A, $10, $C0, $42, $10, $C0, $36, $1B ; 0C00 .byte $C0, $2A, $25, $C0, $42, $25, $C0, $19 ; 0C08 .byte $0D, $83, $52, $28, $84, $17, $0B, $C1 ; 0C10 .byte $54, $2A, $42 ; 0C18 L0C1B: .byte $00, $20, $70, $20, $00, $20, $70, $E0 ; 0C1B .byte $50, $08, $80, $50, $38, $70, $20, $08 ; 0C23 .byte $08, $08, $08, $F8, $F8, $80, $80, $80 ; 0C2B .byte $80 ; 0C33 L0C34: .byte $0E, $FF, $FF, $3F, $2A, $2E, $2A, $2E ; 0C34 .byte $70, $FF, $FF, $FC, $54, $74, $54, $74 ; 0C3C .byte $5D, $55, $5D, $55, $5D, $55, $5D, $55 ; 0C44 .byte $00, $40, $60, $7D, $7F, $7D, $00, $00 ; 0C4C .byte $00, $02, $06, $BE, $FE, $BE, $00, $00 ; 0C54 L0C5C: .byte $08, $13, $1F, $9D, $9A, $92, $9E, $8F ; 0C5C .byte $92, $9C, $8E ; 0C64 L0C67: .byte $30, $2E, $C0, $33, $2E, $C0, $31, $33 ; 0C67 .byte $C0, $0B, $32, $80, $5C, $32, $40 ; 0C6F L0C76: .byte $0C, $0B, $17, $40, $45, $40, $40, $00 ; 0C76 .byte $00, $00, $00, $40, $45, $40, $40, $04 ; 0C7E .byte $33, $2E, $4B, $4E, $5E, $66, $09, $1C ; 0C86 .byte $20, $4B, $56, $4A, $4C, $54, $53, $4A ; 0C8E .byte $4C, $54 ; 0C96 L0C98: .byte $F8, $84, $82, $81, $81, $81, $81, $FF ; 0C98 .byte $00, $00, $00, $1C, $23, $22, $22, $DC ; 0CA0 .byte $00, $00, $00, $78, $C7, $44, $44, $38 ; 0CA8 .byte $04, $04, $04, $04, $FC, $44, $44, $7F ; 0CB0 .byte $10, $28, $28, $28, $28, $28, $10, $EF ; 0CB8 .byte $00, $00, $00, $08, $14, $14, $08, $F6 ; 0CC0 L0CC8: .byte $FF, $C3, $A5, $99, $99, $A5, $C3, $FF ; 0CC8 L0CD0: .byte $0B, $30, $19, $8A, $DF, $5E, $99, $00 ; 0CD0 .byte $4D, $59, $D9, $CD, $56, $8E ; 0CD8 L0CDE: .byte $1B, $10, $82, $50, $27, $82, $25, $0D ; 0CDE .byte $C1, $3D, $10, $C1, $36, $1B, $C1, $2F ; 0CE6 .byte $25, $C1, $47, $28, $C1, $17, $0B, $C0 ; 0CEE .byte $54, $2A, $40 ; 0CF6 L0CF9: .byte $00, $20, $F8, $70, $00, $00, $50, $20 ; 0CF9 .byte $50, $00, $20, $70, $D8, $70, $20 ; 0D01 L0D08: .byte $09, $16, $1D, $5D, $5A, $4A, $4C, $4E ; 0D08 .byte $00, $61, $4A, $5C ; 0D10 L0D14: .byte $0D, $10, $13, $00, $42, $43, $00, $00 ; 0D14 .byte $00, $47, $42, $00, $00, $00, $41, $43 ; 0D1C .byte $0D, $16, $13, $E9, $44, $42, $00, $00 ; 0D24 .byte $EA, $41, $43, $00, $00, $E2, $00, $43 ; 0D2C .byte $0D, $1E, $13, $00, $46, $45, $00, $00 ; 0D34 .byte $00, $45, $49, $00, $00, $00, $43, $49 ; 0D3C L0D44: .byte $2E, $2B, $81, $28, $2C, $43, $35, $2C ; 0D44 .byte $46, $3B, $2C, $49, $35, $24, $42, $3B ; 0D4C .byte $24, $43 ; 0D54 L0D56: .byte $08, $09, $20, $97, $8A, $9E, $91, $9B ; 0D56 .byte $9F, $92, $A4 ; 0D5E L0D61: .byte $03, $27, $14, $40, $40, $40, $01, $2D ; 0D61 .byte $14, $6A, $02, $33, $33, $42, $40, $06 ; 0D69 .byte $11, $27, $CB, $CA, $D0, $CE, $D6, $DD ; 0D71 L0D79: .byte $14, $19, $80, $1A, $19, $80, $30, $19 ; 0D79 .byte $40, $36, $19, $40, $4D, $19, $40, $53 ; 0D81 .byte $19, $40 ; 0D89 L0D8B: .byte $FE, $FE, $FE, $FE, $FE, $FE, $FE, $00 ; 0D8B L0D93: .byte $03, $11, $2E, $98, $92, $97 ; 0D93 L0D99: .byte $D8, $D8, $D8, $D8, $D8, $00, $70, $00 ; 0D99 .byte $70, $00, $00, $F0, $00, $7F, $00 ; 0DA1 L0DA8: .byte $18, $1A, $80, $34, $1A, $40, $51, $1A ; 0DA8 .byte $40 ; 0DB0 L0DB1: .byte $10, $10, $80, $10, $23, $40 ; 0DB1 L0DB7: .byte $09, $08, $17, $CD, $DC, $CA, $D0, $00 ; 0DB7 .byte $DC, $CA, $CC, $CE ; 0DBF L0DC3: .byte $C0, $80, $40, $C0, $80, $40 ; 0DC3 L0DC9: .byte $F0, $F0, $F0, $F0, $00 ; 0DC9 L0DCE: .byte $FF, $FF, $00, $00, $00, $00, $00, $00 ; 0DCE L0DD6: .byte $45, $45, $45, $49, $C5, $4C, $54, $C5 ; 0DD6 .byte $C7, $63, $DD, $D7, $5D, $D1, $DD, $46 ; 0DDE .byte $D4, $64, $67, $61, $DD, $DD, $DD, $D1 ; 0DE6 .byte $87, $57, $CC, $5D, $D7, $6D, $86, $76 ; 0DEE .byte $D4, $6C, $CC, $67, $61, $4B, $64, $92 ; 0DF6 .byte $76, $0C, $C5, $14, $CB, $60, $C6, $75 ; 0DFE .byte $05, $4C, $CB, $6D, $42, $54, $54, $5D ; 0E06 .byte $46, $75, $4C, $C6, $D4, $76, $76, $7B ; 0E0E .byte $8C, $C6, $A4, $54, $67, $54, $54, $51 ; 0E16 .byte $7C, $C2, $76, $7B, $CC, $B6, $76, $76 ; 0E1E L0E26: .byte $FE, $FE, $C0, $C0, $FE, $FE, $00, $00 ; 0E26 .byte $FE, $FE, $C6, $C6, $C6, $C6, $00, $00 ; 0E2E .byte $FE, $FE, $06, $06, $FE, $FE, $00, $00 ; 0E36 .byte $C6, $C6, $C6, $C6, $FE, $FE, $00, $00 ; 0E3E .byte $FE, $FE, $C0, $C0, $C6, $C6, $00, $00 ; 0E46 .byte $FE, $FE, $06, $06, $C6, $C6, $00, $00 ; 0E4E .byte $C6, $C6, $06, $06, $FE, $FE, $00, $00 ; 0E56 .byte $C6, $C6, $C0, $C0, $FE, $FE, $00, $00 ; 0E5E .byte $C6, $C6, $C0, $C0, $C6, $C6, $00, $00 ; 0E66 .byte $FE, $FE, $00, $00, $C6, $C6, $00, $00 ; 0E6E .byte $C6, $C6, $06, $06, $C6, $C6, $00, $00 ; 0E76 .byte $C6, $C6, $00, $00, $FE, $FE, $00, $00 ; 0E7E .byte $FE, $FE, $00, $00, $FE, $FE, $00, $00 ; 0E86 .byte $C6, $C6, $C6, $C6, $C6, $C6, $00, $00 ; 0E8E L0E96: .byte $04, $33, $2B, $57, $4A, $64, $4E ; 0E96 L0E9D: .byte $15, $1A, $40, $18, $0D, $40, $35, $0A ; 0E9D .byte $40, $50, $0D, $40, $12, $22, $41, $37 ; 0EA5 .byte $14, $41, $58, $22, $41, $37, $1D, $42 ; 0EAD .byte $35, $36, $43, $34, $31, $84, $36, $30 ; 0EB5 .byte $45, $2F, $30, $C6 ; 0EBD L0EC1: .byte $10, $38, $38, $28, $28, $10, $38, $38 ; 0EC1 .byte $28, $E8, $A0, $F0, $70, $50, $50, $20 ; 0EC9 .byte $70, $70, $D8, $00, $80, $80, $80, $80 ; 0ED1 .byte $80, $E0, $E0, $00, $00, $00, $20, $78 ; 0ED9 .byte $70, $50, $50 ; 0EE1 L0EE4: .byte $08, $25, $20, $8B, $8A, $9D, $8E, $8B ; 0EE4 .byte $8A, $96, $96 ; 0EEC L0EEF: .byte $F8, $88, $88, $88, $F8, $20, $60, $20 ; 0EEF .byte $20, $70, $F8, $08, $F8, $80, $F8, $F8 ; 0EF7 .byte $08, $38, $08, $F8, $88, $88, $F8, $08 ; 0EFF .byte $08, $F8, $80, $F8, $08, $F8, $80, $80 ; 0F07 .byte $F8, $88, $F8, $F8, $08, $10, $10, $10 ; 0F0F .byte $F8, $88, $F8, $88, $F8, $F8, $88, $F8 ; 0F17 .byte $08, $08, $F8, $88, $F8, $88, $88, $F8 ; 0F1F .byte $48, $78, $48, $F8, $F8, $80, $80, $80 ; 0F27 .byte $F8, $F8, $48, $48, $48, $F8, $F8, $80 ; 0F2F .byte $E0, $80, $F8, $F8, $80, $E0, $80, $80 ; 0F37 .byte $F8, $80, $98, $88, $F8, $88, $88, $F8 ; 0F3F .byte $88, $88, $F8, $20, $20, $20, $F8, $F8 ; 0F47 .byte $20, $20, $A0, $E0, $90, $A0, $C0, $A0 ; 0F4F .byte $90 ; 0F57 L0F58: .byte $00, $C8, $FF, $C8, $00, $80, $80, $80 ; 0F58 .byte $80, $F8, $88, $D8, $A8, $88, $88, $88 ; 0F60 .byte $C8, $A8, $98, $88, $F8, $88, $88, $88 ; 0F68 .byte $F8, $F8, $88, $F8, $80, $80, $F8, $88 ; 0F70 .byte $88, $90, $E8, $F8, $88, $F8, $90, $88 ; 0F78 .byte $F8, $80, $F8, $08, $F8, $F8, $20, $20 ; 0F80 .byte $20, $20, $88, $88, $88, $88, $F8, $88 ; 0F88 .byte $88, $88, $50, $20, $88, $88, $A8, $D8 ; 0F90 .byte $88, $88, $50, $20, $50, $88, $88, $88 ; 0F98 .byte $F8, $20, $20, $F8, $10, $20, $40, $F8 ; 0FA0 .byte $00, $00, $00, $00, $00, $F8, $08, $38 ; 0FA8 .byte $00, $20, $00, $00, $00, $00, $40, $20 ; 0FB0 .byte $20, $20, $00, $20, $20, $20, $F8, $20 ; 0FB8 .byte $20, $00, $00, $F8, $00, $00 ; 0FC0 ; ----------------------------------------------------------------------------- ; lr A,KU ; 0fc5 00 ; bios_draw_a01fc_wrapper ; Wrapper for BIOS routine $01FC. Used for a repeated object/sprite style draw. ; ----------------------------------------------------------------------------- bios_draw_a01fc_wrapper: lr K,P ; 0FC6 08 pi pushk ; 0FC7 28 01 07 - bios pushk - save return address on BIOS K-stack jmp $01FC ; 0FCA 29 01 FC - unconditional jump ; ----------------------------------------------------------------------------- ; b_drawchar_bmp_wrapper ; Wrapper for BIOS drawchar bitmap entry. Sets r4=8 before tail-jumping into ; BIOS drawchar internals. ; ----------------------------------------------------------------------------- b_drawchar_bmp_wrapper: lr K,P ; 0FCD 08 pi pushk ; 0FCE 28 01 07 - bios pushk - save return address on BIOS K-stack lis 8 ; 0FD1 78 lr 4,A ; 0FD2 54 jmp b_drawchar_bmp_entry ; 0FD3 29 06 8A - unconditional jump ; ----------------------------------------------------------------------------- ; bios_score_prompt_wrapper ; Wrapper around BIOS score/prompt rendering helper. Initializes object bytes ; at O26/O27 before BIOS calls. ; ----------------------------------------------------------------------------- bios_score_prompt_wrapper: lr K,P ; 0FD6 08 pi pushk ; 0FD7 28 01 07 - bios pushk - save return address on BIOS K-stack lisu 2 ; 0FDA 62 lisl 6 ; 0FDB 6E li $99 ; 0FDC 20 99 lr I,A ; 0FDE 5D - store A and increment ISAR lr S,A ; 0FDF 5C - store A in selected scratchpad register pi b_score_left ; 0FE0 28 02 AC pi b_score_right ; 0FE3 28 02 B5 pi popk ; 0FE6 28 01 1E - restore return address from BIOS K-stack pk ; 0FE9 0C - return via K/P after BIOS K-stack restore ; ----------------------------------------------------------------------------- ; clear_screen_o37_0 ; Clear-screen wrapper variant. Stores 0 in O37 before calling BIOS clearscrn. ; ----------------------------------------------------------------------------- clear_screen_o37_0: clr ; 0FEA 70 br clear_screen_common ; 0FEB 90 02 - unconditional jump ; ----------------------------------------------------------------------------- ; clear_screen_o37_1 ; Clear-screen wrapper variant. Stores 1 in O37 before calling BIOS clearscrn. ; ----------------------------------------------------------------------------- clear_screen_o37_1: lis 1 ; 0FED 71 ; ----------------------------------------------------------------------------- ; clear_screen_common ; Common clear-screen helper. Stores O37, builds r3=$D0+r3, then calls BIOS ; clearscrn. ; ----------------------------------------------------------------------------- clear_screen_common: lisu 3 ; 0FEE 63 lisl 7 ; 0FEF 6F lr S,A ; 0FF0 5C - store A in selected scratchpad register lr K,P ; 0FF1 08 pi pushk ; 0FF2 28 01 07 - bios pushk - save return address on BIOS K-stack li $D0 ; 0FF5 20 D0 as 3 ; 0FF7 C3 lr 3,A ; 0FF8 53 pi clrscrn ; 0FF9 28 00 D0 - bios clear screen routine pi popk ; 0FFC 28 01 1E - restore return address from BIOS K-stack pk ; 0FFF 0C - return via K/P after BIOS K-stack restore IF 0 ; Smart data report ; ================= ; Mode: enabled by -s or /s ; Memory range: $0800-$0FFF ; Code bytes: 1070 ; Data bytes: 978 ; ; DCI data roots from reachable code: ; $0BC6 from $0809 ; $0BCF from $0816 ; $0BD8 from $0845 ; $0BE6 from $086B ; $0C98 from $0878 ; $0CC8 from $0899 ; $0CC8 from $08A8 ; $0CC8 from $08B7 ; $0CC8 from $08C3 ; $0CD0 from $08C9 ; $0C00 from $08FD ; $0C1B from $0907 ; $0BF9 from $0914 ; $0EEF from $0BB0 ; $0E9D from $0B57 ; $0EC1 from $0B63 ; $0EE4 from $0B6D ; $0C76 from $099D ; $0C34 from $09B3 ; $0C67 from $09B7 ; $0C5C from $09CA ; $0CDE from $09DA ; $0CF9 from $09E4 ; $0D08 from $09EE ; $0D14 from $0A18 ; $0D44 from $0A32 ; $0D56 from $0A43 ; $0D61 from $0A53 ; $0D79 from $0A6F ; $0D8B from $0A7B ; $0D99 from $0A85 ; $0DA8 from $0A89 ; $0D93 from $0A9C ; $0DB1 from $0AA7 ; $0F58 from $0AB3 ; $0DC3 from $0AD8 ; $0DC9 from $0AE0 ; $0DCE from $0AF5 ; $0DCE from $0B01 ; $0DB7 from $0B0A ; $0DD6 from $0B15 ; $0E26 from $0B2A ; $0E26 from $0B33 ; $0E96 from $0B4C ; ; Data intervals emitted as .byte: ; $0BF4-$0FC5 (978 bytes) ENDIF