Advertisement
verz

Cerchio

Aug 29th, 2019
589
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .org 08000h
  2.  
  3.  
  4.         jp _main
  5.        
  6.  
  7. _pDkstr     = 09000h                ; indirizzo della lista dei nodi raggiungibili (Dijkstra)
  8. _pExitList  = 08f00h                ; indirizzo della lista dei nodi finali raggiungibili (Dijkstra, solo puntatori)
  9. _pEL        .word _pExitList    ; puntatore ad un nuovo elemento della lista dei nodi finali
  10. _timer      .db 0,0
  11. _regspace   .db 0,0
  12. _number     .db 0,0,0,0,0,0,0   ; buffer conversione da int a stringa
  13. count       .db 0
  14. u           .word _pDkstr       ; puntatore all'ultimo nodo della lista dei nodi raggiungibili (Dijkstra)
  15. w           .word _pDkstr       ; cursore della lista dei nodi; contiene il puntatore al nodo in valutazione
  16. xp          .db 0
  17. xm          .db 0
  18. yp          .db 0
  19. ym          .db 0
  20. DimNodo     = 05h               ; ogni nodo è di 5 byte:
  21.                                 ; nodo = {  byte "X"
  22.                                 ;           byte "Y"
  23.                                 ;           byte "distanza dal nodo precedente"
  24.                                 ;           word "puntatore al nodo precedente"   }
  25.  
  26.  
  27. _main
  28.     ;exx
  29.     ;push hl        ; save alternate HL
  30.    
  31. ;----------------reset time
  32.     ld a,0
  33.     ld (23672),a
  34.     ld (23673),a
  35.     ld (23674),a
  36.  
  37. ;----------------reset dei valori (elimina flag visitato, ripristina i puntatori)
  38. ;                fa funzionare il programma anche al secondo RUN
  39.     ld hl,_map
  40.     ld de,529
  41. _rsettab
  42.     ld a,(hl)
  43.     and 07fh
  44.     ld (hl),a
  45.     inc hl
  46.     dec e
  47.     jp nz, _rsettab
  48.     dec d
  49.     jp p, _rsettab
  50.  
  51.     ld bc,_pExitList    ; reset pointers
  52.     ld (_pEL),bc
  53.     ld bc,_pDkstr
  54.     ld (u),bc
  55.     ld (w),bc
  56.     ld bc,0h
  57.     ld (_number),bc
  58.     ld (_number+2),bc
  59.     ld (_number+4),bc
  60.     ld (_number+6),bc
  61. ;----------------
  62.  
  63.     ld hl,_pDkstr   ; punta alla lista dei nodi visitati
  64.     ld a,11         ; inserisce i dati del nodo iniziale; l'indice è zero-based
  65.     ld (hl),a
  66.     inc hl
  67.     ld (hl),a
  68.     inc hl
  69.     ld (hl),0h
  70.     inc hl
  71.     ld (hl),0h
  72.     inc hl
  73.     ld (hl),0h
  74.  
  75.     ld bc,00b0bh    ; cella iniziale (12,12); l'indice è zero-based
  76.     call _CellBC
  77.     or 080h
  78.     ld (hl),a
  79.  
  80. _loopDijkstra
  81.     call _CellBC
  82.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  83.     cp 10
  84.     jp z,_nextnode
  85.     ld d,a
  86.    
  87.     ld a,c          ; calcola le coordinate dei nodi raggiungibili in base alla distanza
  88.     add a,d
  89.     ld (xp),a       ;   (xm,ym)   (x,ym)  (xp,ym)
  90.     ld a,c          ;          \    |    /
  91.     sub d           ;           \   |   /
  92.     ld (xm),a       ;            \  |  /
  93.     ld a,b          ;   (xm,y) ---(x,y)--- (xp,y)
  94.     add a,d         ;            /  |  \
  95.     ld (yp),a       ;           /   |   \
  96.     ld a,b          ;          /    |    \
  97.     sub d           ;   (xm,yp)   (x,yp)  (xp,yp)
  98.     ld (ym),a
  99.    
  100.     ld iyh,b
  101.     ld iyl,c
  102.  
  103. _N  or a
  104.     jp m, _E
  105.     ;ld a,(ym)
  106.     ld b,a
  107.     inc b           ; valuta se siamo passati sopra una cella finale
  108.     call _CellBC   
  109.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  110.     cp 10
  111.     jp z,_NE        ; se sì salta a "NordEst"
  112.     dec b
  113.     call _CellBC    ; raccoglie il valore del nodo a Nord
  114.     or a
  115.     jp m,_NE        ; se già visitato passa oltre
  116.     jp z,_NE        ; se zero (fuori dal cerchio) passa oltre
  117.     or 080h         ; imposta il bit di "visitato" (bit 7)
  118.     ld (hl),a       ; segna il nodo come visitato
  119.     ld hl,(u)       ; inserisce i dati del nodo nella lista
  120.     ld de,DimNodo
  121.     add hl,de  
  122.     ld (u),hl       ; u punta al nodo inserito
  123.     ld (hl),c       ; coordinata X
  124.     inc hl
  125.     ld (hl),b       ; coordinata Y
  126.     inc hl
  127.     ld (hl),1       ; direzione Nord
  128.     inc hl
  129.     ld bc,(w)
  130.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  131.     inc hl
  132.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  133.     and 07fh        ; rimuove il flag di "visitato" (bit 7)
  134.     cp 10           ; è un nodo finale?
  135.     call z,_2list   ; lo aggiunge alla lista
  136.    
  137. _NE ld a,(xp)
  138.     cp 23
  139.     jp p, _S
  140.     ;ld a,(xp)
  141.     ld c,a
  142.     ld a,(ym)
  143.     ld b,a
  144.     inc b           ; valuta se siamo passati sopra una cella finale
  145.     dec c
  146.     call _CellBC
  147.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  148.     cp 10
  149.     jp z,_E         ; se sì salta a "Est"
  150.     dec b
  151.     inc c
  152.     call _CellBC    ; raccoglie il valore del nodo a NordEst
  153.     or a
  154.     jp m,_E         ; se già visitato passa oltre
  155.     jp z,_E         ; se zero (fuori dal cerchio) passa oltre
  156.     or 080h         ; imposta il bit di "visitato" (bit 7)
  157.     ld (hl),a       ; segna il nodo come visitato
  158.     ld hl,(u)       ; aggiunge il nodo alla lista
  159.     ld de,DimNodo
  160.     add hl,de  
  161.     ld (u),hl       ; u punta al nodo inserito
  162.     ld (hl),c       ; coordinata X
  163.     inc hl
  164.     ld (hl),b       ; coordinata Y
  165.     inc hl
  166.     ld (hl),2       ; direzione NordEst
  167.     inc hl
  168.     ld bc,(w)
  169.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  170.     inc hl
  171.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  172.     and 07fh
  173.     cp 10           ; è un nodo finale?
  174.     call z,_2list   ; lo aggiunge alla lista
  175.    
  176. _E  ld a,(xp)
  177.     cp 23
  178.     jp p,_S
  179.     ;ld a,(xp)
  180.     ld c,a
  181.     ld b,iyh
  182.     dec c           ; valuta se siamo passati sopra una cella finale
  183.     call _CellBC
  184.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  185.     cp 10
  186.     jp z,_SE        ; se sì salta a "SudEst"
  187.     inc c
  188.     call _CellBC    ; raccoglie il valore del nodo a Est
  189.     or a
  190.     jp m,_SE        ; se già visitato passa oltre
  191.     jp z,_SE        ; se zero (fuori dal cerchio) passa oltre
  192.     or 080h         ; imposta il bit di "visitato" (bit 7)
  193.     ld (hl),a       ; segna il nodo come visitato
  194.     ld hl,(u)       ; aggiunge il nodo alla lista
  195.     ld de,DimNodo
  196.     add hl,de  
  197.     ld (u),hl       ; u punta al nodo inserito
  198.     ld (hl),c       ; coordinata X
  199.     inc hl
  200.     ld (hl),b       ; coordinata Y
  201.     inc hl
  202.     ld (hl),3       ; direzione Est
  203.     inc hl
  204.     ld bc,(w)
  205.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  206.     inc hl
  207.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  208.     and 07fh
  209.     cp 10           ; è un nodo finale?
  210.     call z,_2list   ; lo aggiunge alla lista
  211.    
  212. _SE ld a,(yp)
  213.     cp 23
  214.     jp p,_O
  215.     ;ld a,(yp)
  216.     ld b,a
  217.     ld a,(xp)
  218.     ld c,a
  219.     dec c           ; valuta se siamo passati sopra una cella finale
  220.     dec b
  221.     call _CellBC
  222.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  223.     cp 10
  224.     jp z,_S         ; se sì salta a "Sud"
  225.     inc c
  226.     inc b
  227.     call _CellBC    ; raccoglie il valore del nodo a SudEst
  228.     or a
  229.     jp m,_S         ; se già visitato passa oltre
  230.     jp z,_S         ; se zero (fuori dal cerchio) passa oltre
  231.     or 080h         ; imposta il bit di "visitato" (bit 7)
  232.     ld (hl),a       ; segna il nodo come visitato
  233.     ld hl,(u)       ; aggiunge il nodo alla lista
  234.     ld de,DimNodo
  235.     add hl,de  
  236.     ld (u),hl       ; u punta al nodo inserito
  237.     ld (hl),c       ; coordinata X
  238.     inc hl
  239.     ld (hl),b       ; coordinata Y
  240.     inc hl
  241.     ld (hl),4       ; direzione SudEst
  242.     inc hl
  243.     ld bc,(w)
  244.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  245.     inc hl
  246.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  247.     and 07fh
  248.     cp 10           ; è un nodo finale?
  249.     call z,_2list   ; lo aggiunge alla lista
  250.    
  251. _S  ld a,(yp)
  252.     cp 23
  253.     jp p,_O
  254.     ;ld a,(yp)
  255.     ld b,a
  256.     ld c,iyl
  257.     dec b           ; valuta se siamo passati sopra una cella finale
  258.     call _CellBC
  259.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  260.     cp 10
  261.     jp z,_SO        ; se sì salta a "SudOvest"
  262.     inc b
  263.     call _CellBC    ; raccoglie il valore del nodo a Sud
  264.     or a
  265.     jp m,_SO        ; se già visitato passa oltre
  266.     jp z,_SO        ; se zero (fuori dal cerchio) passa oltre
  267.     or 080h         ; imposta il bit di "visitato" (bit 7)
  268.     ld (hl),a       ; segna il nodo come visitato
  269.     ld hl,(u)       ; aggiunge il nodo alla lista
  270.     ld de,DimNodo
  271.     add hl,de  
  272.     ld (u),hl       ; u punta al nodo inserito
  273.     ld (hl),c       ; coordinata X
  274.     inc hl
  275.     ld (hl),b       ; coordinata Y
  276.     inc hl
  277.     ld (hl),5       ; direzione Sud
  278.     inc hl
  279.     ld bc,(w)
  280.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  281.     inc hl
  282.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  283.     and 07fh
  284.     cp 10           ; è un nodo finale?
  285.     call z,_2list   ; lo aggiunge alla lista
  286.    
  287. _SO ld a,(xm)
  288.     or a
  289.     jp m,_nextnode
  290.     ;ld a,(xm)
  291.     ld c,a
  292.     ld a,(yp)
  293.     ld b,a
  294.     dec b           ; valuta se siamo passati sopra una cella finale
  295.     inc c
  296.     call _CellBC
  297.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  298.     cp 10
  299.     jp z,_O         ; se sì salta a "Ovest"
  300.     inc b
  301.     dec c
  302.     call _CellBC    ; raccoglie il valore del nodo a SudOvest
  303.     or a
  304.     jp m,_O         ; se già visitato passa oltre
  305.     jp z,_O         ; se zero (fuori dal cerchio) passa oltre
  306.     or 080h         ; imposta il bit di "visitato" (bit 7)
  307.     ld (hl),a       ; segna il nodo come visitato
  308.     ld hl,(u)       ; aggiunge il nodo alla lista
  309.     ld de,DimNodo
  310.     add hl,de  
  311.     ld (u),hl       ; u punta al nodo inserito
  312.     ld (hl),c       ; coordinata X
  313.     inc hl
  314.     ld (hl),b       ; coordinata Y
  315.     inc hl
  316.     ld (hl),6       ; direzione SudOvest
  317.     inc hl
  318.     ld bc,(w)
  319.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  320.     inc hl
  321.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  322.     and 07fh
  323.     cp 10           ; è un nodo finale?
  324.     call z,_2list   ; lo aggiunge alla lista
  325.    
  326. _O  ld a,(xm)
  327.     or a
  328.     jp m,_nextnode
  329.     ;ld a,(xm)
  330.     ld c,a
  331.     ld b,iyh
  332.     inc c           ; valuta se siamo passati sopra una cella finale
  333.     call _CellBC
  334.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  335.     cp 10
  336.     jp z,_NO        ; se sì salta a "NordOvest"
  337.     dec c
  338.     call _CellBC    ; raccoglie il valore del nodo a Ovest
  339.     or a
  340.     jp m,_NO        ; se già visitato passa oltre
  341.     jp z,_NO        ; se zero (fuori dal cerchio) passa oltre
  342.     or 080h         ; imposta il bit di "visitato" (bit 7)
  343.     ld (hl),a       ; segna il nodo come visitato
  344.     ld hl,(u)       ; aggiunge il nodo alla lista
  345.     ld de,DimNodo
  346.     add hl,de  
  347.     ld (u),hl       ; u punta al nodo inserito
  348.     ld (hl),c       ; coordinata X
  349.     inc hl
  350.     ld (hl),b       ; coordinata Y
  351.     inc hl
  352.     ld (hl),7       ; direzione Ovest
  353.     inc hl
  354.     ld bc,(w)
  355.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  356.     inc hl
  357.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  358.     and 07fh
  359.     cp 10           ; è un nodo finale?
  360.     call z,_2list   ; lo aggiunge alla lista
  361.    
  362. _NO ld a,(ym)
  363.     or a
  364.     jp m, _nextnode
  365.     ;ld a,(ym)
  366.     ld b,a
  367.     ld a,(xm)
  368.     ld c,a
  369.     inc b           ; valuta se siamo passati sopra una cella finale
  370.     inc c
  371.     call _CellBC
  372.     and 07fh        ; rimuove l'eventuale flag di "visitato" (bit 7)
  373.     cp 10
  374.     jp z,_nextnode  ; se sì salta a valutare il prossimo nodo
  375.     dec b
  376.     dec c
  377.     call _CellBC    ; raccoglie il valore del nodo a NordOvest
  378.     or a
  379.     jp m,_nextnode  ; se già visitato passa oltre
  380.     jp z,_nextnode  ; se zero (fuori dal cerchio) passa oltre
  381.     or 080h         ; imposta il bit di "visitato" (bit 7)
  382.     ld (hl),a       ; segna il nodo come visitato
  383.     ld hl,(u)       ; aggiunge il nodo alla lista
  384.     ld de,DimNodo
  385.     add hl,de  
  386.     ld (u),hl       ; u punta al nodo inserito
  387.     ld (hl),c       ; coordinata X
  388.     inc hl
  389.     ld (hl),b       ; coordinata Y
  390.     inc hl
  391.     ld (hl),8       ; direzione NordOvest
  392.     inc hl
  393.     ld bc,(w)
  394.     ld (hl),c       ; indirizzo del nodo precedente (byte basso)
  395.     inc hl
  396.     ld (hl),b       ; indirizzo del nodo precedente (byte alto)
  397.     and 07fh
  398.     cp 10           ; è un nodo finale?
  399.     call z,_2list   ; lo aggiunge alla lista
  400.    
  401. _nextnode
  402.     ld hl,(w)       ; si sposta al prox nodo della lista
  403.     ld de,DimNodo   ; si sposta di "DimNodo" (5 byte)
  404.     add hl,de
  405.     ld (w),hl
  406.     ld c,(hl)       ; recupera le coordinate del nuovo nodo
  407.     inc hl
  408.     ld b,(hl)
  409.     dec hl
  410.    
  411.     ex de,hl
  412.     ld hl,(u)       ; verifica che non siamo oltre il fine lista
  413.     or a
  414.     sbc hl,de
  415.     jp p,_loopDijkstra
  416.  
  417.  
  418. ;---------------Print list
  419.         ld a,1
  420.         ld (col),a
  421.         ld (row),a
  422.  
  423. _prlp                   ; mette nello stack la lista dei nodi (cammino completo)
  424.         ld bc,0h        ; mette 0h nello stack
  425.         push bc
  426.         ld hl,(_pEL)    ; ritrova un nodo finale dalla lista
  427.         dec hl          ; sposta indietro il puntatore della lista (2 byte)
  428.         dec hl
  429.         ld (_pEL),hl
  430.         ld c,(hl)       ; legge il puntatore al nodo
  431.         inc hl
  432.         ld b,(hl)
  433.         ld a,b
  434. _nxt    cp 0            ; controlla se la coordinata del nodo precedente è zero (nodo iniziale)
  435.         jp z,_enddig    ; se zero esce
  436.         push bc         ; mette nello stack il puntatore al nodo
  437.         inc bc          ; recupera il puntatore al nodo precedente
  438.         inc bc
  439.         inc bc
  440.         ld a,(bc)
  441.         ld e,a
  442.         inc bc
  443.         ld a,(bc)
  444.         ld b,a
  445.         ld c,e
  446.         jp _nxt
  447. _enddig
  448.         ld a,(col)
  449.         ld c,a
  450.         ld a,(row)
  451.         ld b,a
  452. _lpprn
  453.         ld (row),a
  454.         call SetCursPos
  455.         pop bc              ; estrae un nodo dallo stack
  456.         ld a,b
  457.         or a
  458.         jp z,_endret        ; se zero esce (il primo valore era 0h)
  459.         ld a,(bc)           ; legge la coordinata x dal nodo
  460.         inc a               ; incrementa di 1 (l'indice è zero-based)
  461.         call bin2bcd8       ; la converte in BCD
  462.         ld ixh,a
  463.         ld de,_number
  464.         call cvtUpperNibble ; la converte in stringa (stringa in DE)
  465.         ld a,ixh
  466.         call cvtLowerNibble
  467.         ld a,','            ; aggiunge ","
  468.         ld (de),a
  469.         inc de
  470.         inc bc             
  471.         ld a,(bc)           ; legge la coordinata y del nodo
  472.         inc a               ; incrementa di 1 (l'indice è zero-based)
  473.         call bin2bcd8       ; la converte in BCD
  474.         ld ixh,a
  475.         call cvtUpperNibble ; la converte in stringa
  476.         ld a,ixh
  477.         call cvtLowerNibble
  478.         ld de,_number
  479.         call WriteString    ; stampa la stringa a schermo nn,mm
  480.         pop bc              ; recupera il nodo successivo
  481.         ld a,b             
  482.         or a
  483.         jp z,_endret        ; se zero esce
  484.         push bc             ; rimette nello stack il nodo
  485.         inc bc
  486.         inc bc
  487.         ld a,(bc)           ; recupera la direzione
  488.             cp 1
  489.                 ld de,_stN
  490.                 jr z,_f
  491.             cp 2   
  492.                 ld de,_stNE
  493.                 jr z,_f
  494.             cp 3   
  495.                 ld de,_stE
  496.                 jr z,_f
  497.             cp 4   
  498.                 ld de,_stSE
  499.                 jr z,_f
  500.             cp 5   
  501.                 ld de,_stS
  502.                 jr z,_f
  503.             cp 6   
  504.                 ld de,_stSO
  505.                 jr z,_f
  506.             cp 7   
  507.                 ld de,_stO
  508.                 jr z,_f
  509.             ;cp 8  
  510.                 ld de,_stNO
  511.             ;   jp z,_f
  512. _f      call WriteString    ; stampa la direzione
  513.         ld a,(col)          ; prepara la prossima coordinata video, su nuova riga
  514.         ld c,a
  515.         ld a,(row)
  516.         inc a
  517.         ld b,a
  518.         jp _lpprn
  519. _endret
  520.         ld a,(col)          ; legge il numero di colonna
  521.         add a,12            ; aumenta di 12
  522.         ld (col),a
  523.         ld a,1
  524.         ld (row),a          ; torna alla prima riga
  525.  
  526.         ld bc,(_pEL)        ; verifica che il cursore della lista non sia all'inizio
  527.         ld hl,_pExitList
  528.         or a
  529.         sbc hl,bc
  530.         jp m,_prlp          ; se non siamo all'inizio allora loop
  531.        
  532.  
  533. ;----------------save final time
  534.     ld a,(23672)
  535.     ld (_timer),a
  536.     ld a,(23673)
  537.     ld (_timer+1),a
  538.  
  539.  
  540.     ld a,(_timer)               ; stampa il tempo impiegato
  541.     ld l,a
  542.     ld a,(_timer+1)
  543.     ld h,a
  544.     call NormTime
  545.     ld bc, 01102h
  546.     call SetCursPos
  547.     ld de,_tottime
  548.     call WriteString
  549.     ld de,_number
  550.     call WriteTrimNumber
  551.     ld de,_msec
  552.     call WriteString
  553.  
  554. _rts
  555.     ;pop hl     ; restore HL as alternate
  556.     ;exx
  557.     ret
  558.  
  559. row .db 0
  560. col .db 0
  561.  
  562. _stN  .db " N",0
  563. _stNE .db " NE",0
  564. _stE  .db " E",0
  565. _stSE .db " SE",0
  566. _stS  .db " S",0
  567. _stSO .db " SO",0
  568. _stO  .db " O",0
  569. _stNO .db " NO",0
  570. _tottime .db "Tempo Totale:  ",0   
  571. _msec .db "ms",0
  572.  
  573.  
  574.  
  575. _2list              ; aggiunge il nodo alla lista di quelli finali
  576.     ld de,(u)
  577.     ld hl,(_pEL)
  578.     ld (hl),e
  579.     inc hl
  580.     ld (hl),d
  581.     inc hl
  582.     ld (_pEL),hl
  583.     ret
  584.  
  585.  
  586.  
  587. ; in:
  588. ;   BC the cell reference x,y  (C,B)
  589. ; out:
  590. ;   HL pointer to the cell
  591. ;   A  cell value
  592. ;   BC still the reference x,y  (C,B)
  593. _CellBC
  594.     ld d,0
  595.     ld h,d
  596.     ld a,b
  597.     add a,a     ; y*2
  598.     add a,a     ; y*4
  599.     add a,b     ; y*5
  600.     add a,a     ; y*10
  601.     add a,b     ; y*11
  602.     add a,a     ; y*22
  603.     rl h
  604.     add a,b     ; y*23
  605.     ld l,a
  606.     ld e,c
  607.     adc hl,de   ; +x
  608.     ld de,_map
  609.     add hl,de
  610.     ld a,(hl)
  611.     ret
  612.  
  613.  
  614. _map
  615. .db  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  616. .db  0, 0, 0, 0, 0, 0, 0,10,10,10, 4, 7, 7,10,10,10, 0, 0, 0, 0, 0, 0, 0
  617. .db  0, 0, 0, 0, 0,10,10, 5, 4, 4, 8, 3, 3, 4, 6, 3,10,10, 0, 0, 0, 0, 0
  618. .db  0, 0, 0, 0,10, 1, 4, 5, 1, 1, 1, 4, 5, 1, 7, 1, 3, 5,10, 0, 0, 0, 0
  619. .db  0, 0, 0,10, 4, 9, 4, 9, 6, 7, 5, 5, 5, 8, 7, 6, 6, 8, 5,10, 0, 0, 0
  620. .db  0, 0,10, 3, 7, 2, 9, 8, 3, 5, 6, 7, 3, 9, 1, 8, 7, 5, 8, 5,10, 0, 0
  621. .db  0, 0,10, 1, 4, 7, 8, 4, 2, 9, 2, 7, 1, 1, 8, 2, 2, 7, 6, 3,10, 0, 0
  622. .db  0,10, 7, 2, 1, 8, 5, 5, 3, 1, 1, 3, 1, 3, 3, 4, 2, 8, 6, 1, 3,10, 0
  623. .db  0,10, 4, 2, 6, 7, 2, 5, 2, 4, 2, 2, 5, 4, 3, 2, 8, 1, 7, 7, 3,10, 0
  624. .db  0,10, 4, 1, 6, 5, 1, 1, 1, 9, 1, 4, 3, 4, 4, 3, 1, 9, 8, 2, 7,10, 0
  625. .db 10, 4, 3, 5, 2, 3, 2, 2, 3, 2, 4, 2, 5, 3, 5, 1, 1, 3, 5, 5, 3, 7,10
  626. .db 10, 2, 7, 1, 5, 1, 1, 3, 1, 5, 3, 3, 2, 4, 2, 3, 7, 7, 5, 4, 2, 7,10
  627. .db 10, 2, 5, 2, 2, 6, 1, 2, 4, 4, 6, 3, 4, 1, 2, 1, 2, 6, 5, 1, 8, 8,10
  628. .db  0,10, 4, 3, 7, 5, 1, 9, 3, 4, 4, 5, 2, 9, 4, 1, 9, 5, 7, 4, 8,10, 0
  629. .db  0,10, 4, 1, 6, 7, 8, 3, 4, 3, 4, 1, 3, 1, 2, 3, 2, 3, 6, 2, 4,10, 0
  630. .db  0,10, 7, 3, 2, 6, 1, 5, 3, 9, 2, 3, 2, 1, 5, 7, 5, 8, 9, 5, 4,10, 0
  631. .db  0, 0,10, 1, 6, 7, 3, 4, 8, 1, 1, 1, 2, 1, 2, 2, 8, 9, 4, 1,10, 0, 0
  632. .db  0, 0,10, 2, 5, 4, 7, 8, 7, 5, 6, 1, 3, 5, 7, 8, 7, 2, 9, 3,10, 0, 0
  633. .db  0, 0, 0,10, 6, 5, 6, 4, 6, 7, 2, 5, 2, 2, 6, 3, 4, 7, 4,10, 0, 0, 0
  634. .db  0, 0, 0, 0,10, 2, 3, 1, 2, 3, 3, 3, 2, 1, 3, 2, 1, 1,10, 0, 0, 0, 0
  635. .db  0, 0, 0, 0, 0,10,10, 7, 4, 4, 5, 7, 3, 4, 4, 7,10,10, 0, 0, 0, 0, 0
  636. .db  0, 0, 0, 0, 0, 0, 0,10,10,10, 3, 3, 4,10,10,10, 0, 0, 0, 0, 0, 0, 0
  637. .db  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  638.  
  639.  
  640. ;*****************************
  641. ;    a(BIN) =>  a(BCD)
  642. ;   [0..99] => [00h..99h]
  643. ;*****************************
  644. bin2bcd8
  645.     push bc
  646.     ld  c, a
  647.     ld  b, 8
  648.     xor a
  649. lpBcd
  650.     sla c
  651.     adc a, a
  652.     daa
  653.     djnz    lpBcd
  654.     pop bc
  655.     ret
  656.    
  657.    
  658. ;;--------------------------------------------------
  659. ;; Binary to BCD conversion
  660. ;;
  661. ;; Converts a 16-bit unsigned integer into a 6-digit
  662. ;; BCD number. 1181 Tcycles
  663. ;;
  664. ;; input: HL = unsigned integer to convert
  665. ;; output: C:HL = 6-digit BCD number
  666. ;; destroys: A,F,B,C,D,E,H,L
  667. ;;--------------------------------------------------
  668. Bin2Bcd
  669.     LD BC, 16*256+0 ; handle 16 bits, one bit per iteration (ld b,16 and ld c,0)
  670.     LD DE, 0
  671. cvtLoop
  672.     ADD HL, HL
  673.     LD A, E
  674.     ADC A, A
  675.     DAA
  676.     LD E, A
  677.     LD A, D
  678.     ADC A, A
  679.     DAA
  680.     LD D, A
  681.     LD A, C
  682.     ADC A, A
  683.     DAA
  684.     LD C, A
  685.     DJNZ cvtLoop
  686.     EX de,hl
  687.     RET
  688.  
  689. ;;----------------------------------------------------
  690. ;; Converts a 6-digit BCD number to a hex ASCII string
  691. ;;
  692. ;; input: DE = pointer to start of ASCII string
  693. ;; C:HL number to be converted
  694. ;; output: DE = pointer past end of ASCII string
  695. ;; destroys: A,F,D,E
  696. ;;-----------------------------------------------------
  697. Bcd2HexAscii
  698.     push de
  699.     LD A, C
  700.     CALL cvtUpperNibble
  701.     LD A, C
  702.     CALL cvtLowerNibble
  703.     LD A, H
  704.     CALL cvtUpperNibble
  705.     LD A, H
  706.     CALL cvtLowerNibble
  707.     LD A, L
  708.     CALL cvtUpperNibble
  709.     LD A, L
  710.     CALL cvtLowerNibble
  711.  
  712. NormNumber                          ; remove '0's at beginning  (002513 --> __2513)
  713.         pop hl
  714.         ld d,h
  715.         ld e,l
  716.         ld b,5
  717. _cy     ld a,(hl)
  718.         cp '0'
  719.         jp nz, _normalized
  720.         ld (hl),20h
  721.         inc hl
  722.         djnz _cy
  723. _normalized
  724.         ret
  725.  
  726. cvtUpperNibble
  727.     RRA ; move upper nibble into lower nibble
  728.     RRA
  729.     RRA
  730.     RRA
  731. cvtLowerNibble
  732.     AND 0Fh     ; isolate lower nibble
  733.     ADD a,090h  ; old trick
  734.     DAA         ; for converting
  735.     ADC A,040h  ; one nibble
  736.     DAA         ; to hex ASCII
  737.     LD (DE), A
  738.     INC DE
  739.     RET
  740.  
  741.  
  742.  
  743. ;------------------WriteString
  744. ;
  745. ; prints a NULL-terminated string
  746. ;
  747. ;   requires:   HL: pointer to screen position
  748. ;               DE: pointer to the string to print
  749. ;
  750. ;   after execution, HL will point to next screen position
  751. ;
  752. WriteString
  753.     ld a,(de)
  754.     or a
  755.     ret z
  756.     call WriteChar
  757.     inc de
  758.     jp WriteString
  759.  
  760. ;WriteNumber
  761. ;   ld a,(de)
  762. ;   or a
  763. ;   ret z
  764. ;   call WriteChar
  765. ;   inc de
  766. ;   jr WriteNumber
  767.  
  768. WriteTrimNumber
  769.     ld a,(de)
  770.     or a
  771.     ret z
  772.     call TrimChar
  773.     inc de
  774.     jr WriteTrimNumber
  775.  
  776.  
  777.  
  778. ;------------------WriteChar
  779. ;
  780. ; requires the first cell address in HL
  781. ; and the char to be printed in A
  782. ;
  783. TrimChar    ; skips spaces
  784.     cp ' '
  785.     ret z
  786.     ;jp nz, WriteChar
  787.     ;ret
  788.  
  789. WriteChar
  790.     ld (_regspace),hl
  791.     push hl
  792.     push bc
  793.     push de
  794.     ld d,0
  795.     ld e,a
  796.     ;and a
  797.     ;RL  E
  798.     sla E       ; Multiply by 8 <- each character shape is rendered with 8 bytes
  799.     RL  D       ; computes in DE the displacement for the character to print
  800.     RL  E
  801.     RL  D
  802.     RL  E
  803.     RL  D
  804.     ld hl,(05C36H)   ;15360,  3C00H
  805.     add hl,de
  806.     ld de,(_regspace)
  807.     ld b,8
  808. _c1 ld a,(hl)       ; loads each byte of the character
  809.     ld (de),a       ; and copies them to destination in video memory
  810.     inc d
  811.     inc l
  812.     djnz _c1
  813.     pop de
  814.     pop bc
  815.     pop hl
  816.     inc hl
  817.     ret
  818.  
  819.  
  820.  
  821. ;------------------SetCursPos
  822. ;
  823. ; requires (x,y) cell being passed by (C,B), (1..32,1..24)
  824. ; puts in HL the address of the first cell line
  825. ;
  826. SetCursPos
  827.     dec b
  828.     dec c
  829.     ld a,b
  830.     and 018h
  831.     or 040h
  832.     ld h,a
  833.     ld a,b
  834.     rrca
  835.     rrca
  836.     rrca
  837.     and 224
  838.     or c
  839.     ld l,a
  840.     ret
  841.  
  842. NormTime        ; time is in 50th of seconds; Multiplying it by 20 (=milliseconds)
  843.     ld d,h
  844.     ld e,l
  845.     add hl,hl           ; x2
  846.     add hl,hl           ; x4
  847.     add hl,de           ; x5
  848.     add hl,hl           ; x10
  849.     add hl,hl           ; x20
  850.     call Bin2Bcd
  851.     ld de,_number
  852.     call Bcd2HexAscii
  853.     ret
  854.    
  855. _KeyPressed
  856.     ld bc, 07FFEh   ; keyboard row 1-5/joystick port 2.
  857. _r  in a,(c)        ; see what keys are pressed.
  858.     and 1fh
  859.     cp 1fh
  860.     jr nz,_exit     ; a key is pressed
  861.     rrc b           ;2B - 2|8(4,4)
  862.     jr _r
  863. _exit
  864.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement